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

Mad*_*aks 10 apache mod-rewrite

使用mod_rewrite的,我想使用一个服务器变量作为部分CondPatternRewriteCond,是这样的:

RewriteCond %{HTTP_HOST} !^%{SERVER_NAME} [NC]
                           ^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

据我所知,上述文档没有提及任何关于它的内容,而且谷歌搜索我无法找到任何确定的内容.我的预感是答案是否定的,但我想肯定地知道.

mxx*_*xxk 10

CondPattern没有扩展%{VAR}变量或%N反向引用到以前RewriteCond,所以大卫的建议

RewriteCond %{SERVER_NAME} ^(.*)$
RewriteCond %{HTTP_HOST} !%1
Run Code Online (Sandbox Code Playgroud)

只要%{HTTP_HOST}不包含文字字符串就会成功%1,这不是你想要的.

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

RewriteCond %{HTTP_HOST} !^%{SERVER_NAME} [NC]
Run Code Online (Sandbox Code Playgroud)

如果HTTP_HOST不以SERVER_NAME(不区分大小写)开头匹配.您可以使用单个实现它,RewriteCond如果您包含SERVER_NAMETestString,在正则表达式中捕获它,并使用\N再次引用它:

RewriteCond "%{SERVER_NAME} %{HTTP_HOST}" "!(^[^ ]*) \1" [NC]
Run Code Online (Sandbox Code Playgroud)

正则表达式使用空格来分隔SERVER_NAME,HTTP_HOST因为两个变量都不能有空格.

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

如果你实际上只是想测试是否SERVER_NAME等于HTTP_HOST,那么使用Apache表达式会更简单:

# Case-sensitive comparison.
RewriteCond expr "%{HTTP_HOST} == %{SERVER_NAME}"
Run Code Online (Sandbox Code Playgroud)

要么

# Case-insensitive comparison.
RewriteCond expr "tolower(%{HTTP_HOST}) == tolower(%{SERVER_NAME})"
Run Code Online (Sandbox Code Playgroud)