mod_rewrite RewriteCond - 只是域名部分所需的NC标志?还有一些

时间:2011-04-07 13:56:10

标签: regex .htaccess mod-rewrite case-insensitive

我在htaccess这些规则中多次见过:

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

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

在仅检查域部分时,为什么需要NC标记?

我注意到浏览器总是会将域名中的大写字母转换为小写,所以在这种情况下,我看不到[NC]标记的用途是什么。

我的意思是,如果我们检查网址的剩余部分,我理解在{@ 1}}上需要[NC]标志因为www.domain.com/index.html文件与www.domain.com/INDEX.HTML不同,但我不明白当我们只检查RewriteRule中的域部分时,需要NC标志。


由于您花时间阅读上述内容,我还要问一个小问题NC标志没有直接关系,但仍然与RewriteCond

上面显示的RewriteCond都运行良好,我认为只有点之前的斜线才会起作用(!^www\.domain\.it$),因为没有斜线的点应该表示'any char' 在正则表达式中,\.表示点字符,但另一个表现也很好,你知道为什么吗?

3 个答案:

答案 0 :(得分:39)

拥有[NC]绝对不是强制性的,但建议将其用于匹配域。现代浏览器可能会将域名转换为小写但是旧浏览器和命令行工具如wgetcurl等等,所以你不应该总是依赖客户端发送小写域名并保持{{1 }}

关于您的第二个问题[NC]匹配任何字符,因此它可以与.匹配,但它也会匹配您不想要的www.domain.com文字匹配。所以最好有www-domain-com

答案 1 :(得分:8)

NC = nocase表示无论传入的引荐来源流量与给定模式的匹配情况如何。

请参阅Apache [NC|nocase] flag

答案 2 :(得分:3)

我不确定[NC],但我认为在某些不太可能的情况下,ENV var。可以包含大写字母。

正则表达式中的点表示一个字符,任何字符。因此,如果字符串为http://www_domain-ithttp://wwwadomain1it

,则第一个条件也会匹配