apache httpd - RewriteCond SERVER_NAME不等于SERVER_ADDR

Dan*_*iel 5 apache mod-rewrite http

如果SERVER_ADDRSERVER_NAME变量不匹配,我需要重定向用户.

我的httpd.conf文件中有以下规则:

RewriteEngine on
RewriteCond %{SERVER_NAME} !%{SERVER_ADDR}
RewriteRule .* /myRedirectPage.html [PT]
Run Code Online (Sandbox Code Playgroud)

当SERVER_NAME和SERVER_ADDR不匹配时,我正确地被重定向.但是,即使它们匹配,我也会被重定向.

如果我使用以下条件,它适用于匹配和非匹配方案:(其中192.168.1.1是服务器IP)

RewriteCond %{SERVER_NAME} !192.168.1.1
Run Code Online (Sandbox Code Playgroud)

为了检查变量是否匹配,我使用了PHP $_SERVER['SERVER_NAME']$_SERVER['SERVER_ADDR']变量.

我该怎么写RewriteCond,以便它不会重定向用户if SERVER_NAMESERVER_ADDRmatch?

Dav*_*tti 9

您不能在RewriteCond的右侧使用服务器变量,因此您要匹配文字字符串"%{SERVER_ADDR}",而不是变量,因此,由于您的匹配被否定("!"),规则始终匹配.

我想你可以做这样的事情,虽然我自己从未使用过这种特殊的格式:

RewriteCond %{SERVER_NAME},%{SERVER_ADDR} ^(.*),\1

这个想法是你正在做两个匹配 - 你匹配%{SERVER_NAME}任何东西(总是匹配)并捕获结果,然后匹配%{SERVER_ADDR}第一个匹配的反向引用,这是匹配%{SERVER_NAME}.

再一次,我没有使用像我这样的规则,只是阅读它,所以它可能需要一些调整.

  • 请注意,`%{SERVER_NAME}`的内容不同,具体取决于UseCanonicalName的值.如果你有'On',那么`{%SERVER_NAME}`只是从VirtualHost携带ServerName.所以也许你想在你的情况下总是使用`{%HTTP_HOST}`. (2认同)