apache httpd - RewriteCond SERVER_NAME 不等于 SERVER_ADDR
Posted
技术标签:
【中文标题】apache httpd - RewriteCond SERVER_NAME 不等于 SERVER_ADDR【英文标题】:apache httpd - RewriteCond SERVER_NAME not equal to SERVER_ADDR 【发布时间】:2013-01-14 19:33:13 【问题描述】:如果SERVER_ADDR
和SERVER_NAME
变量不匹配,我需要重定向用户。
我的 httpd.conf 文件中有以下规则:
RewriteEngine on
RewriteCond %SERVER_NAME !%SERVER_ADDR
RewriteRule .* /myRedirectPage.html [PT]
当 SERVER_NAME 和 SERVER_ADDR 不匹配时,我会正确重定向。 但是,即使它们匹配,我也会被重定向。
如果我使用以下条件,它适用于匹配和不匹配的场景:(其中 192.168.1.1 是服务器 IP)
RewriteCond %SERVER_NAME !192.168.1.1
为了检查变量是否匹配,我使用了 php 的 $_SERVER['SERVER_NAME']
和 $_SERVER['SERVER_ADDR']
变量。
如果SERVER_NAME
和SERVER_ADDR
匹配,我应该如何编写 RewriteCond 以便它不会重定向用户?
【问题讨论】:
这有点令人困惑。SERVER_ADDR
(IP)和SERVER_NAME
(名称)是识别同一域的两种方法。所以它们总是“匹配”,因为这些是服务器传递的变量。另一方面,一个是数字,另一个是字符串。你如何比较它们,即使是 PHP 代码?
我使用vardump($_SERVER)
显示它们,但 php 将这两个值都标识为字符串。我正在制作一个强制门户,其中所有 tcp 流量都被重定向到服务器。例如,如果用户尝试访问http://www.google.com/
,用户将被重定向到我的php页面,其中SERVER_ADDR=192.168.1.1
和SERVER_NAME=www.google.com
。
SERVER_NAME 是您在 HTTP Host 标头中的内容,当您使用 IP 而不是主机名时,您可以具有相同的值,在其他情况下,此值无法匹配。
【参考方案1】:
您不能在 RewriteCond 的右侧使用服务器变量,因此您匹配的是文字字符串 "%SERVER_ADDR"
,而不是变量,因此,由于您的匹配被否定(“!”),规则总是匹配。
我认为您可以这样做,尽管我自己从未使用过这种特殊格式:
RewriteCond %SERVER_NAME,%SERVER_ADDR ^(.*),\1
这个想法是你正在做两个匹配 - 你将 %SERVER_NAME
与任何东西(总是匹配)进行匹配并捕获结果,然后将 %SERVER_ADDR
与第一个匹配的反向引用匹配,这是匹配%SERVER_NAME
.
再说一次,我自己没有使用过这样的规则,只是阅读了一下,所以可能需要一些调整。
【讨论】:
请注意,%SERVER_NAME
的内容是不同的,具体取决于 UseCanonicalName 的值。如果您将其设置为“打开”,则%SERVER_NAME
只是携带来自 VirtualHost 的 ServerName。所以也许你想在你的情况下总是使用%HTTP_HOST
。
是否有指向 \1 反向引用的文档链接?以上是关于apache httpd - RewriteCond SERVER_NAME 不等于 SERVER_ADDR的主要内容,如果未能解决你的问题,请参考以下文章
apache编译安装 httpd 2.2 httpd 2.4