问题描述
在使用 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/$1 [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/$1 [R=301,L]
解决方法
我确定:
RewriteRule ^/(.*)$ https://www.target.com/path/$1 [R=301,NC,L]
和
RewriteRule ^/(.*)$ https://www.target.com/path/$1 [R=301,L]
没什么区别。
信息:NC
标志表示非大小写。
但是当您使用以下内容时:
RewriteRule (.*\.(jpg|gif|png))$ http://images.example.com$1 [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]