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

问题描述

在使用 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]