Mod_rewrite RewriteCond - это флаг NC, необходимый только для части домена? И еще несколько
Я неоднократно видел в htaccess
следующие типы правил:
RewriteCond %{HTTP_REFERER} !^http://www.domain.it$ [NC]
или
RewriteCond %{HTTP_HOST} !^www\.domain\.it$ [NC]
Почему нужен флаг NC
при проверке только части домена?
Я заметил, что браузеры всегда конвертируют верхние регистры в именах доменов в нижние регионы, поэтому я не вижу, что в этом случае флаг [NC]
является допустимым.
Я имею в виду, если мы проверим оставшуюся часть URL-адреса, я понимаю необходимость возникновения флага [NC]
в системах Unix www.domain.com/index.html
- это другой файл, чем www.domain.com/index.html
, но я не понимаю необходимости флага NC
когда мы проверяем только часть домена в RewriteRule.
Поскольку вы нашли время, чтобы прочитать выше, позвольте мне задать еще один незначительный вопрос, не связанный напрямую с флагом NC
, но все же связанный с RewriteCond
Оба RewriteCond
, показанные выше, работают хорошо, я думал, что только с косой чертой, когда точки будут работать (!^www\.domain\.it$
), потому что точка без косой черты должна означать "any char" в regexp, в то время как \.
означает точку char, но, кроме всего прочего, другая работает хорошо, знаете ли вы, почему?
Ответы
Ответ 1
Наличие [NC]
определенно не обязательно, но рекомендуется иметь его для сопоставления доменов. Современные браузеры могут преобразовывать имена доменов в нижний регистр, но как насчет старых браузеров и служебных команд командной строки, таких как wget
, curl
и т.д., Поэтому вы не всегда должны полагаться на клиентов, отправляющих вам нижнее имя домена и сохраняя [NC]
.
О вашем втором вопросе .
соответствует любой символ, поэтому он может соответствовать www.domain.com
, но он также будет соответствовать тексту www-domain-com
, который вы не хотите сопоставлять. Поэтому лучше иметь www\.domain\.com
Ответ 2
NC = nocase
означает, что независимо от случая, когда входящий трафик перенаправления соответствует заданному шаблону.
Смотрите флаг Apache [NC | nocase]
Ответ 3
Я точно не знаю [NC], но я полагаю, что в каком-то маловероятном случае ENV var. может содержать символы верхнего регистра.
Точка в регулярном выражении означает один символ, любой символ. SO первое условие также будет соответствовать, если строка http://www_domain-it или http://wwwadomain1it