Mad*_*aks 10 apache mod-rewrite
使用mod_rewrite的,我想使用一个服务器变量作为部分CondPattern
的RewriteCond
,是这样的:
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_NAME
在TestString
,在正则表达式中捕获它,并使用\N
再次引用它:
RewriteCond "%{SERVER_NAME} %{HTTP_HOST}" "!(^[^ ]*) \1" [NC]
Run Code Online (Sandbox Code Playgroud)
正则表达式使用空格来分隔SERVER_NAME
,HTTP_HOST
因为两个变量都不能有空格.
如果你实际上只是想测试是否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)