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


9

我正在尝试不使用www重定向网址。到www.version(从example.com到www.example.com)。我用平常的

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

这适用于我所有其他项目。但是,在此特定站点上,它以重定向循环结尾。这是一个很奇怪的部分:我试图卷曲非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的定义:

<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>

EDIT2:好的,我只是想知道如果我这样做(辞职并尝试在没有.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');

它会导致完全相同的重定向循环。说真的,到底是什么?有谁知道这可能是什么原因?


您是自己编译Apache还是?Location标头应该与页面中的内容不同是不可能的,因为在这种情况下,它们是从同一变量中提取的,所以这很奇怪。我假设请求是直接传递给Apache的,对,中间没有其他服务器了吗?
蒂姆·斯通·斯通

我自己没有编译apache,并且在这之间没有其他服务器。

可能您的NS服务器配置不正确
venimus 2011年

4
无需在ServerAlias条目中重复服务器名称。
克里斯

您可以将文件的所有内容放在这里吗?
撤消

Answers:


2

让我感到奇怪的是Location: http://domain.cz/CURL报告的标题行。您永远不会重定向到该域。重定向日志也没有任何提及。

Location在modrewrite完成其工作后,标头似乎有所更改,并且由于您也尝试使用PHP更改标头,因此Location在处理请求后,标头显然已更改。我能想到的唯一解释是您正在某处用mod_header修改位置标头。

如果在某处找到类似于以下内容的行,是否检查了所有配置文件(httpd.conf,随附的.conf文件和.htaccess文件):

Header set Location (...)

要么

Header edit Location (...)

我还没找到这样的东西。

2
您是否直接连接到Apache,或者它们之间是否存在一些可能更改标头的缓存或代理服务器?ProxyPassReverse指令也可能会更改位置标头(httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse)。

中间可能会有一些代理,明天上班后我会尽快研究一下。

@Jakob Egger-我在任何地方都找不到ProxyPassReverse指令。
密码

1

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

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

另外,请检查apache配置的其余部分,以查看是否还有其他“重定向”指令可能会发生冲突。


该应用程序还可以,我在其他服务器和不同域(复制了整个应用程序)上进行了尝试,并且可以正常工作。我想这是Apache配置中的东西,但我不知道是什么。

该应用程序可能还可以,但也可能与服务器上的设置冲突。听起来您的应用目前正在生产中,所以我可以看到“禁用它”是多么不理想。为了娱乐,您可以在重定向的末尾添加一个查询字符串作为有助于发现的标志-所以/ $ 1?nowww = 1或类似的东西。
加文·C

不,它不在生产中。

噢,很酷,然后将索引文件移到100%排除它作为问题的一部分就可以了:)
Gavin C

噢,该死,我要写的是生产中的tis IS,不知道这是怎么发生的:-)

0

您可以尝试以下替代mod_rewrite代码:

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

失败完全相同。

您可以启用RewriteLog并查看其内容吗?
anubhava 2011年

我到底该怎么做?:-)

请参阅此处:httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog唯一的事情是,此指令进入了.htaccess中的apache配置。
anubhava 2011年

1
我将相同的规则(如上面的回答)复制到了我的Apache安装程序中,并运行了您在问题中使用的相同curl命令,并将其Location: http://www.domain.com/作为我的标头的一部分,因此在我的情况下,标头和html都显示了相同的域,即www.domain.com。您还可以在上述问题中粘贴相关的access.log行吗?
anubhava 2011年

0

您能否尝试使用[NC]而不是[nc],可能是如此简单


但它不是:-)(已经尝试过,没有用)

0

我希望您可以访问服务器,在指定了站点文档文件夹之后添加了重定向行

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

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

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


RewriteEngine on正如我所说,我已经添加了,它可以在另一台服务器上正常工作,而不能在另一台服务器上工作。

AllowOverride全部允许所有在服务器配置文件中添加这些行

0

尝试:

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

0

确保Options +FollowSymLinks在目录上下文中工作。

否则,如果您使用的是基于名称的虚拟主机,请尝试:

<VirtualHost *:80>
  ServerName domain.cz
  Redirect / http://www.domain.cz/
</VirtualHost>

<VirtualHost *:80>
  ServerName www.domain.cz
  # whatever else
</VirtualHost>

我已经用VirtualHost的定义更新了问题。

您是否尝试过上述多个VirtualHost解决方案,还是已开始使用mod_rewrite?
克里斯

最初,我不想使用多个VirtualHost,但是鉴于这种情况,我还是尝试了一下,但没有帮助。

0

阅读所有答案后,您可以检查/ etc / hosts文件...也许所有检查都来自计算机。尝试从其他位置访问。


不,关于该域的主机中没有任何内容。

0

我有第二个想法。您发布的服务器日志显示的地址为“ 192.168.1.221”,这是来自本地网络的地址。所有日志条目都显示相同的IP地址吗?在这种情况下,您与服务器之间存在一个代理。该代理可能使用ProxyPassReverseHeader edit更改Location标头。

当后端服务器将其自己的主机名Location(而不是外部代理服务器的主机名)放入标头时,这是一种通常的设置来解决该问题。

如果确实存在代理服务器,则必须更改代理服务器的配置,而不是后端服务器的配置,因为代理将始终覆盖信息。

这意味着我们一直在寻找错误的服务器:问题出在代理服务器上!


明天我打电话给运行该服务器的公司的技术支持。我想一定是的,我会让你知道。
密码

0

可能是不可打印的字符,例如.htaccess文件中的null 。

hexdump -C .htaccess

0

我相信您在重写条件后会丢失$符号。请试试:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.