Apache2 在强制 www 时导致无限重定向循环

Apache2 在强制 www 时导致无限重定向循环

我试图强制我的网站上的用户使用 www 版本,但我的配置导致无限重定向循环。相关配置如下:

<VirtualHost *:80>
  ServerName  www.mydomain.com

  DirectoryIndex index.html index.php
  DocumentRoot /home/me/sites/mydomain.com/htdocs

  # Log file locations
  LogLevel warn
  ErrorLog  /home/me/sites/mydomain.com/logs/error.log
  CustomLog /home/me/sites/mydomain.com/logs/access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName mydomain.com
    RedirectMatch permanent ^/(.*) http://www.mydomain.com/$1
</VirtualHost>

我从 Stack Overflow 上的答案中发现这种方法是最可接受的方法。

但是,当浏览www.mydomain.commydomain.com发生以下情况时:

https://i.stack.imgur.com/ajSNx.png

正如您所看到的,它在 www 和非 www 之间来回跳转,直到浏览器退出。

我已经通过将其从我的文档根目录中完全删除来验证这不是 .htaccess 问题,但它仍然发生。

有任何想法吗?

答案1

您肯定在某处有另一个重定向。

为了确保万无一失,我在本地设置了您的重定向:

<VirtualHost *:80>
  ServerName  www.ddddd.com
  DirectoryIndex index.html index.php
  DocumentRoot E:/temp
    <Directory "E:/temp">
        Order Allow,Deny
        Allow from 127.0.0.1
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName ddddd.com
    RedirectMatch permanent ^/(.*) http://www.ddddd.com/$1
</VirtualHost>

主办方:

127.0.0.1           www.ddddd.com
127.0.0.1           ddddd.com

重定向回同一服务器,效果很好。由于我看不到您的实际域名,因此无法查看您的 DNS 情况,但如果您绝对肯定您在 www 服务器上没有其他重定向,这就是我要查看的地方:挖掘这两个域。www 可能不在您认为的位置,或者 DNS 可能将所有子域指向根域。

另一种可能性是您的 www.mydomain.com/index.php 包含以下内容。

<?php
Header( "HTTP/1.1 301 Moved Permanently" ); 
Header( "Location: http://mydomain.com" ); 
?>

答案2

在我看来,这条规则正在重定向一切到 www(包括 www.mydomain.com)。
下面是我在 .htaccess 中使用的重定向规则,用于实现 www 重定向:

RewriteCond %{HTTP_HOST} !^www.mydomain.com$ [NC]  
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,QSA,L]

请注意,这将重定向全部子域名为 www,因此您可能需要使用

RewriteCond %{HTTP_HOST} ^mydomain.com$ [NC] 
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,QSA,L]

仅重定向没有明确子域的调用。

答案3

您的 Apache 配置不对此负责 - Apache 中运行的应用程序代码正在从 重定向www到非www域。

当发生 Apache 配置无法解释的重定向时,通常可以假设这种情况,但是应用程序生成的重定向的不同大小和更慢的响应时间进一步增加了这种情况的严重性。

相关内容