mod_rewrite RewriteCond - нужен ли флаг NC только для части домена? И еще немного - PullRequest
34 голосов
/ 07 апреля 2011

Я много раз видел в htaccess правила такого типа:

RewriteCond %{HTTP_REFERER} !^http://www.domain.it$ [NC]

или

RewriteCond %{HTTP_HOST} !^www\.domain\.it$ [NC]

Зачем нужен флаг NC при проверкетолько доменная часть?

Я заметил, что браузеры всегда преобразуют прописные буквы в именах доменов в строчные , поэтому я не вижу, для чего в этом полезен флаг [NC]case.

Я имею в виду, что если мы проверим оставшуюся часть url, я понимаю необходимость указания флага [NC] в системах Unix www.domain.com/index.html файл отличается от www.domain.com/INDEX.HTML, но я не понимаю необходимостиNC флаг, когда мы проверяем только часть домена в RewriteRule.


Поскольку вы потратили время на прочтение вышеизложенного, позвольте мне также задать один небольшой вопрос не напрямуюсвязанный с флагом NC, но все еще связанный с RewriteCond

Оба RewriteCond, показанные выше, работают хорошо, я думал, что будет работать только тот, у которого косая черта перед точками (!^www\.domain\.it$), потому что точка без косой черты должна означать 'любой символ' в регулярном выражении, тогда как \. означает точечный символ , но, что удивительно, другой тоже хорошо работает, знаете почему?

Ответы [ 3 ]

39 голосов
/ 07 апреля 2011

Наличие [NC] определенно не является обязательным, но рекомендуется иметь его для соответствующих доменов.Современные браузеры могут преобразовывать доменные имена в нижний регистр, но как насчет старых браузеров и утилит командной строки, таких как wget, curl и т. Д., Поэтому вы не всегда должны полагаться на клиентов, отправляющих вам строчные доменные имена и сохраняющих [NC].

О вашем втором вопросе . соответствует любому символу , поэтому он может соответствовать www.domain.com, но он также будет соответствовать www-domain-com тексту, который вы не хотите сопоставлять.Так что лучше иметь www\.domain\.com

8 голосов
/ 18 октября 2016

NC = nocase означает независимо от случая совпадения входящего трафика реферера с заданным шаблоном.

См. Флаг Apache [NC | nocase]

3 голосов
/ 07 апреля 2011

Я не знаю [NC] наверняка, но я предполагаю, что в некоторых маловероятных случаях ENV var.может содержать символы верхнего регистра.

Точка в регулярном выражении означает один символ, любой символ.Так что первое условие также будет соответствовать, если строка будет http://www_domain -it или http://wwwadomain1it

...