如果用户省略了 www 子域,我想将 URL 重写为 www.example.com/something.html 到 www.example.com/something.html
下面的配置不起作用,用户仍停留在 example.com 上。可能缺少了一些非常简单的东西……
<VirtualHost *:80>
DocumentRoot /data/domains/example.com/www/public
ServerName www.example.com
ServerAlias example.com
# ErrorDocument 404 /index.pl page_not_found
# CustomLog /logs/apache/example.com/access_log combined
# RedirectMatch 301 ^(.*)$ http://www.example.com/
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
</IfModule>
答案1
我自己的解决方案是使用两个虚拟主机,一个非 www 的虚拟主机重定向到另一个带有 www 的虚拟主机,如下所示:
<VirtualHost *:80>
ServerName example.com
Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /data/domains/example.com/www/public
ServerName www.example.com
</VirtualHost>
这样,我就不用再费解 .htaccess 规则了。记住 KISS 原则 ;)
伊斯梅尔·卡辛潘
答案2
我以不同的方式做事;)这是我的工作规则:
# redirect www.fclose.com/* to fclose.com/*
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.fclose\.com$
RewriteRule ^(.*) http://fclose.com/$1 [R=301,L]
你可以尝试一下这些规则:
RewriteBase /
RewriteCond %{HTTP_HOST} ^domain\.com$
RewriteRule ^(.*) http://www.example.com/$1 [R=301,L]
我改变上面的一个并得到它们。
答案3
将您的 RewriteRule 更改为:
RewriteCond %{HTTP_HOST} ^domain\.com
所以整个事情应该是这样的:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
</IfModule>