Apache 循环重定向问题

Apache 循环重定向问题

我的一个网站遇到了一个非常奇怪的问题。我在一个安装了共享 wordpress 的 apache2 服务器上运行多个博客。每个网站都有一个 www.domain.com 主域,但 ServerAlias 为 domain.com。除了一个博客外,其他所有博客都运行正常,这个博客不是重定向到 www.domain.com,而是重定向到 domain.com,从而导致循环重定向。

每个主机的配置如下:

<VirtualHost *:80>
    ServerName www.domain.com
    ServerAlias domain.com
    DocumentRoot "/home/www/www.domain.com"

    <Directory "/home/www/www.domain.com">
        Options MultiViews Indexes Includes FollowSymLinks ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

由于这不起作用,我尝试了 mod_rewrite 规则,但仍然无法正确重定向。奇怪的是,如果我重写它以重定向到任何其他域名它将正确重定向,甚至重定向到另一个子域。因此,重定向到 foo.domain.com 的 domain.com 重写规则有效,但重定向到 www.domain.com 无效。同样,尝试重定向到 www.domain.com/foo/ 最终会重定向到 domain.com/foo/。

更奇怪的是,我尝试将 domain.com 设置为完全独立的虚拟主机,并在其上将此 php 测试脚本作为 index.php 运行:

<?php
header('Location: http://www.domain.com/' . $_SERVER["request_uri"]);
?>

访问 domain.com仍然重定向到 domain.com!检查发送到服务器的标头可验证我是否获得了我想要的重定向 URL,只是删除了“www。”。如果我将 www. 替换为 foo 或重定向到任何其他域,相同的脚本将运行良好。

这个问题困扰了我很久。我对比了工作域和故障域的 vhosts 配置,唯一的区别就是域名本身。我对比了两个站点的 .htaccess 文件,唯一的区别就是与博客的 wordpress 安装共享相关的路径:

php_value include_path ".:/home/www/www.domain.com/local/:/home/www/www.domain.com/"

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

我搜索了 /etc 中的所有内容(包括 apache conf)以查找故障主机的域名,没有发现任何奇怪的东西,又搜索了 /etc 中的所有内容以查找一个可以正常工作的域名以确保它没有差异,我甚至检查了两个域的 DNS 设置以确保没有发生任何奇怪的事情。

以下是对错误问题的响应:

user@localhost dir $ wget -S domain.com
--2010-03-20 21:47:24--  http://domain.com/
Resolving domain.com... x.x.x.x
Connecting to domain.com|x.x.x.x|:80... connected.
HTTP request sent, awaiting response...
  HTTP/1.1 301 Moved Permanently
  Via: 1.1 ISA
  Connection: Keep-Alive
  Proxy-Connection: Keep-Alive
  Content-Length: 0
  Date: Sat, 20 Mar 2010 20:47:24 GMT
  Location: http://domain.com/
  Content-Type: text/html; charset=UTF-8
  Server: Apache
  X-Powered-By: PHP/5.2.10-pl0-gentoo
  X-Pingback: http://domain.com/xmlrpc.php
  Keep-Alive: timeout=15, max=100
Location: http://domain.com/ [following]

还有一个有效的:

user@localhost dir $ wget -S domain.com
--2010-03-20 21:51:33--  http://domain.com/
Resolving domain.com... x.x.x.x
Connecting to domain.com|x.x.x.x|:80... connected.
HTTP request sent, awaiting response...
  HTTP/1.1 301 Moved Permanently
  Via: 1.1 ISA
  Connection: Keep-Alive
  Proxy-Connection: Keep-Alive
  Content-Length: 0
  Date: Sat, 20 Mar 2010 20:51:33 GMT
  Location: http://www.domain.com/
  Content-Type: text/html; charset=UTF-8
  Server: Apache
  X-Powered-By: PHP/5.2.10-pl0-gentoo
  X-Pingback: http://www.domain.com/xmlrpc.php
  Keep-Alive: timeout=15, max=100
Location: http://www.domain.com/ [following]

我被难住了。这个问题我已经困扰很久了,我觉得我已经尝试了所有方法。我不明白为什么在相同的安装和相同的设置下,不同的域会有不同的行为。

帮助 :(

答案1

太棒了!匿名人士在帖子评论中给出了一个很好的答案:

您是否尝试过直接从主机打开网站以排除任何奇怪的 DNS 问题?例如,将 www.domain.com 和 domain.com 的条目添加到 /etc/hosts,然后使用命令提示符中的链接打开网站。如果您设置了单独的虚拟主机(非 wordpress 网站),但仍然被重定向回 domain.com,那么我会怀疑 http 标头中的 Via: 1.1 ISA。快速搜索会显示 Microsoft Internet Security & Acceleration Server。反向代理和缓存服务器等。它可能会导致问题

问题出在(嗯,是)ISA服务器上。由于我没有运行该服务器,因此我仍然不知道为什么会发生这种情况,但是将两个主机添加到/etc/hosts并在本地执行 wget -S 后,我得到了正确的行为。

我需要与运行该服务器的人交谈,看看他们是否知道这是怎么回事,但至少这可以解释为什么我无法理解正在发生的事情。

编辑: 已修复!更改 ISA 服务器规则中的“收件人”规则站点名称即可修复此问题,即使链接转换已关闭。

答案2

Wordpress 有自己的内置重写机制,这可能是导致重定向循环的原因。在 wp_options 表 options_value 字段中搜索域名。

从 wp_options 中选择 *,其中 option_value 类似于'%domain.com%'

在前几行中,您应该看到列出的域名为http://域名.com. 更改这些以包含 www 前缀。

编辑:

还有一件事需要检查。我注意到最新版本的 Firefox 中存在一些奇怪的行为,它似乎在缓存 .htaccess 规则。我无法弄清楚我的重写规则到底出了什么问题,但一旦我清除缓存并重新启动 FF,它们就会神奇地开始工作。

相关内容