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