将 example.com 重写为 www.example.com

将 example.com 重写为 www.example.com

如果用户省略了 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>

相关内容