.htaccess 无法正确重定向到以 www 为前缀的页面

.htaccess 无法正确重定向到以 www 为前缀的页面

我正在尝试将不带 www 的 URL 重定向到 www.version(例如将 example.com 重定向到 www.example.com)。我使用通常的

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

这适用于我所有其他项目。但是在这个特定的网站上,它以重定向循环结束。奇怪的是:我尝试 curl 非 www 版本以查看它使用发送了哪些标头 curl --get http://example.com --dump-header domain.header > domain.html。标头文件如下所示:

HTTP/1.1 301 Moved Permanently
Date: Mon, 06 Jun 2011 14:45:16 GMT
Server: Apache/2.2.16 (Debian)
Location: http://example.com/
Vary: Accept-Encoding
Content-Length: 310
Content-Type: text/html; charset=iso-8859-1

但是,生成的 HTML 文件却是这样的:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at example.com Port 80</address>
</body></html>

(请注意文件之间的地址差异)有人知道如何修复这个问题吗(以及到底是什么原因造成的)?任何其他 URL 重写指令都可以正常工作。

编辑:重写日志包含以下内容:(该网站被很多人访问,因此重写日志很长,我不能 100% 确定这是否是正确的部分)

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] strip per-dir prefix: /var/www/oup/81/ ->
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] applying pattern '(.*)' to uri ''
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] rewrite '' -> 'http://www.example.com/'
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] explicitly forcing redirect with http://www.example.com/
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] escaping http://www.example.com/ for redirect
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] redirect to http://www.example.com/ [REDIRECT/301]

访问日志行(可能是正确的):

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] "GET / HTTP/1.1" 301 555 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24"

虚拟主机的定义:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName example.com
        ServerAlias example.com www.example.com
        DocumentRoot /var/www/example/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/example/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride All
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

编辑2:好的,我刚刚发现如果我这样做(辞职并尝试在没有.htaccess的情况下重定向它):

//if clause determining that we're running on example.com and not www.example.com
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com' . $_SERVER['REQUEST_URI']);
header('Connection: close');

它导致一模一样重定向循环。说真的,这到底是怎么回事?有人知道是什么原因造成的吗?

答案1

让我感到奇怪的是Location: http://domain.cz/CURL 报告的标题行。您从未重定向到该域。重定向日志也没有提及它。

不知何故,Location在 modrewrite 执行完操作后,标头似乎发生了改变,而且由于您也尝试使用 PHP 更改标头,因此Location在处理请求后,标头显然发生了改变。我能想到的唯一解释是,您正在某处使用 mod_header 修改位置标头。

您是否检查了所有配置文件(httpd.conf,包含的.conf 文件和.htaccess 文件),如果在某处发现类似如下的一行:

Header set Location (...)

或者

Header edit Location (...)

答案2

您可以尝试这个替代的 mod_rewrite 代码吗:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

答案3

除了启用 rewritelog(如果您有权更改 httpd.conf)之外,您还应该从等式中删除此站点上的应用程序。暂时删除/重命名默认的 index.php(或为您的应用程序提供服务的任何索引页),以确保它不会导致这种情况。

有许多报告称,如果应用程序(例如 wordpress)配置错误,会导致出现这些 apache 默认重定向页面。

另外,检查 apache 配置的其余部分,看是否有任何其他可能存在冲突的“重定向”指令。

答案4

我希望您有服务器访问权限,在指定的站点文档文件夹后添加了重定向行

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.cz [NC]
RewriteRule ^/(.*) http://www.domain.cz/$1 [L,R=301]

如果您无权访问服务器,请在 httaccess 上添加以下行以开始/更改部分。

可能是您没有在重定向之前添加“RewriteEngine on”。

相关内容