当尝试访问 example.com 时,mod_rewrite 重定向到 www.example.com//

当尝试访问 example.com 时,mod_rewrite 重定向到 www.example.com//

我有一个 VPS,我想在上面设置多个网站。对于其中一个网站,使用当前规则集(如下),访问

hxxp://example.com 

送我到

hxxp://www.example.com// [note the two //]

我的 httpd.conf 如下所示:

NameVirtualHost *:80

[other VirtualHosts]

<VirtualHost *:80>
ServerAlias www.example.com example.com
DocumentRoot /var/www/html/example.com
ServerName www.example.com

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

<directory /var/www/html/example.com>

Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ^([0-9]+)(.*)/?$ /showitem.php?j=$1 [NC]

</directory>
</VirtualHost>

答案1

尝试一下这个:

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

答案2

问题是.* 包括URL 中已有的斜线。然后发送http://www.example.com/$1包含另一个斜线的重定向。

以下方法之一可以解决您的问题:

RewriteRule (.*) http://www.example.com$1 [R=301,L]

或者

RewriteRule /(.*) http://www.example.com/$1 [R=301,L]

这不会发生在<Directory >块内或.htaccess文件中,因为在这两种情况下 URI 上都没有前导斜杠。

答案3

您可以通过让指令的正则表达式部分“吃掉”它来轻松摆脱双重 /:

RewriteRule ^/(.*)$ http://www.example.com/$1 [R=301,L]

答案4

我从来没有听说过霍克斯普协议。

您的虚拟主机回答 example.com 和万维网.example.com 请求。

修复很简单:为 www.example.com 添加一个单独的虚拟主机,并从 example.com 中删除 ServerAlias。

然后重定向永久/http://www.example.com/

请注意源和目标上斜线的普遍性 - 这是您所犯的错误。

我不会向您展示如何修复重写规则,因为您不应该使用它。

相关内容