使用mod_rewrite,我想将服务器变量用作CondPattern
的{{1}}的一部分,例如:
RewriteCond
这非常有用。我知道RewriteCond %{HTTP_HOST} !^%{SERVER_NAME} [NC]
^^^^^^^^^^^^^^
是一个与Perl兼容的正则表达式,这意味着例如我的示例中的CondPattern
字符需要以某种方式进行转义。我只是为了证明这个想法而离开了它。
上述文档并没有提及任何有关它的内容,据我所知,谷歌搜索我无法找到任何确定的东西。我的预感是答案是没有,但我想知道肯定。
答案 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_NAME
和HTTP_HOST
,因为这两个变量都不能包含空格。
如果您真的只想测试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进行比较。