【问题标题】:apache httpd - RewriteCond SERVER_NAME not equal to SERVER_ADDRapache httpd - RewriteCond SERVER_NAME 不等于 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 而不是主机名时,您可以具有相同的值,在其他情况下,此值无法匹配。

标签: http mod-rewrite apache


【解决方案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 反向引用的文档链接?
猜你喜欢
  • 2017-09-20
  • 2023-04-01
  • 2012-10-25
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2012-04-06
相关资源
最近更新 更多