10

使用mod_rewrite,我想使用服务器变量作为 a 的一部分CondPatternRewriteCond例如:

RewriteCond %{HTTP_HOST} !^%{SERVER_NAME} [NC]
                           ^^^^^^^^^^^^^^

这将非常有用。我知道这CondPattern是一个与 Perl 兼容的正则表达式,这意味着例如{}我的示例中的字符需要以某种方式转义。我保持原样只是为了展示这个想法。

据我所知,上述文档没有提到任何关于它的内容,并且谷歌搜索我无法找到任何确定的内容。我的直觉是答案是否定的,但我想确定。

4

2 回答 2

10

CondPattern不会扩展%{VAR}变量或%N对前一个的反向引用RewriteCond,所以大卫的建议

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

%{HTTP_HOST}只要不包含文字 string就会成功%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 及更高版本)

如果您实际上只是想测试 if SERVER_NAMEequals ,使用Apache 表达式HTTP_HOST会更简单:

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

或者

# Case-insensitive comparison.
RewriteCond expr "tolower(%{HTTP_HOST}) == tolower(%{SERVER_NAME})"
于 2014-06-20T02:43:51.030 回答
0

不,你不能像那样直接使用变量,但你可以做的是这样的:

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

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

于 2013-02-28T23:01:11.777 回答