我的 RewriteRules 中真的需要 [NC] 吗?

Do I really need a [NC] in my RewriteRules?

在使用 Apache 作为重写代理时,我看到了下面的两种变体,我一直想知道为什么有些人将 NC 标志放在 RewriteRule 的末尾。今天我决定停止疑惑并问问你们所有人:-)

RewriteRule 中没有进行比较,因此 - 据我所知 - 没有必要关注字符串的大小写。我说的对吗,或者你有什么可以教我的吗?

变体 #1:

RewriteCond %{HTTP_HOST} ^(?:www\.)?example-(?:foo|bar|baz)\.(?:com|de|es|fr|it|us)$ [NC]
RewriteRule ^/(.*)$ https://www.target.com/path/ [R=301,NC,L]

变体#2:

RewriteCond %{HTTP_HOST} ^(?:www\.)?example-(?:foo|bar|baz)\.(?:com|de|es|fr|it|us)$ [NC]
RewriteRule ^/(.*)$ https://www.target.com/path/ [R=301,L]

我确定:

RewriteRule ^/(.*)$ https://www.target.com/path/ [R=301,NC,L]

RewriteRule ^/(.*)$ https://www.target.com/path/ [R=301,L]

没有区别。


信息: NC 标志表示不区分大小写。


但是当你使用类似的东西时:

RewriteRule (.*\.(jpg|gif|png))$ http://images.example.com [R=301,NC]

重要!

如果不使用 NC(.*\.(jpg|gif|png))$ 将只匹配:

example.jpg
example.png
example.gif

但是,当您将它与 NC 一起使用时,(.*\.(jpg|gif|png))$ 也将匹配 :

example.JPG
example.jPG
example.Png
example.gIf
#etc....

基本上会匹配example之后的字符,不管是大写还是小写

如果您使用的是 Linux,即使您的 RewriteCond 也不需要 NC

RewriteCond %{HTTP_HOST} ^(?:www\.)?example-(?:foo|bar|baz)\.(?:com|de|es|fr|it|us)$ [NC]

在 Linux 上效果不佳。

但是,如果您使用 Windows,您可能需要始终使用 NC 来代替 RewriteCond

但是,在一种情况下,当您在 Linux 或 Windows 中比较 %{HTTP_HOST} 时,您可能总是需要添加 NC 标志。因为域不区分大小写:

RewriteCond %{HTTP_HOST} !www\.example\.com [NC]