是否可以在RewriteCond的CondPattern中使用mod_rewrite服务器变量?

时间:2013-02-28 19:39:23

标签: apache mod-rewrite

使用mod_rewrite,我想将服务器变量用作CondPattern的{​​{1}}的一部分,例如:

RewriteCond

这非常有用。我知道RewriteCond %{HTTP_HOST} !^%{SERVER_NAME} [NC] ^^^^^^^^^^^^^^ 是一个与Perl兼容的正则表达式,这意味着例如我的示例中的CondPattern字符需要以某种方式进行转义。我只是为了证明这个想法而离开了它。

上述文档并没有提及任何有关它的内容,据我所知,谷歌搜索我无法找到任何确定的东西。我的预感是答案是没有,但我想知道肯定。

2 个答案:

答案 0 :(得分:10)

CondPattern不会将%{VAR}变量或%N反向引用扩展到之前的RewriteCond,因此大卫的建议

RewriteCond %{SERVER_NAME} ^(.*)$
RewriteCond %{HTTP_HOST} !%1
只要%{HTTP_HOST}不包含文字字符串%1

就会成功,这不是您想要的。

根据你的例子,你想要什么

RewriteCond %{HTTP_HOST} !^%{SERVER_NAME} [NC]
如果HTTP_HOST不以SERVER_NAME开头(不区分大小写),则

匹配。如果您在RewriteCond中加入SERVER_NAME,在正则表达式中捕获它,并使用TestString再次引用它,则可以使用单个\N实现此目的:

RewriteCond "%{SERVER_NAME} %{HTTP_HOST}" "!(^[^ ]*) \1" [NC]

正则表达式使用空格分隔SERVER_NAMEHTTP_HOST,因为这两个变量都不能包含空格。

Apache表达式(版本2.4及更高版本)

如果您真的只想测试SERVER_NAME是否等于HTTP_HOST,那么使用Apache expressions会更简单:

# Case-sensitive comparison.
RewriteCond expr "%{HTTP_HOST} == %{SERVER_NAME}"

# Case-insensitive comparison.
RewriteCond expr "tolower(%{HTTP_HOST}) == tolower(%{SERVER_NAME})"

答案 1 :(得分:0)

不,你不能直接使用这个变量,但是你能做的就是这样:

RewriteCond %{SERVER_NAME} ^(.*)$
RewriteCond %{HTTP_HOST} !%1

第一行应始终匹配并捕获SERVER_NAME。然后第二行使用捕获的值与HTTP_HOST进行比较。