首页 > 解决方案 > 我的 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]

标签: apachemod-rewriteproxyurl-rewriting

解决方案


我确定:

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,您可能需要始终使用NCfor RewriteCond

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

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

推荐阅读