如何使用htaccess将非www URL重定向到www URL?

15
我有一个网站,例如http://www.example.com/,在我的网站根目录下,我已经添加了.htaccess文件,将http://example.com/的任何请求重定向到http://www.example.com/
最近,我创建了一个新的“视频”部分,因此视频的URL为http://www.example.com/videos/。在这个视频文件夹中,我有另一个htaccess文件,用于执行视频条目的重写。当我尝试访问http://example.com/videos/时,它没有将我重定向到http://www.example.com/videos/ 我认为.htaccess没有从父目录继承先前的规则。请问是否有人可以告诉我,我可以在/videos/文件夹的.htaccess文件中添加哪个规则,以便将http://example.com/videos/的任何请求重定向到http://www.example.com/videos/ URL。
4个回答

48

这是一个更通用的解决方案,因为它可以在不必在每个 .htaccess 文件中指定特定域名的情况下使用任何域名:

# Redirect non-www to www:
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

相反的情况也是可能的(从www变成非www):

# Redirect www to non-www
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

2
我正在使用Magento,这段代码将//mywebsite.com/some/url重定向到//www.mywebsite.com/index.php。还有其他步骤可以保持URL的持久性吗? - Thomas Bennett
1
我认为你必须从规则中的$1附近删除一个“/”: RewriteRule ^(.*)$ http://www.%{HTTP_HOST}$1 [R=301,L] - Bahadir Tasdemir

9

我认为可能是您现有的规则过于严格,在子目录中无法触发。像这样的内容应该在整个网站上都有效:

RewriteEngine on
RewriteBase /

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

我应该把这条规则放在父根目录的 .htaccess 中还是放在视频文件夹的 .htaccess 中? - djmzfKnm
它应该在根目录中工作。我在我的根目录的.htaccess文件中有类似的内容,它可以在子目录中正常工作。 - Laurence Gonsalves

1
这是使用htaccess将非www重定向到www URL的最佳解决方案。在htaccess文件中使用此代码并检查URL即可。
Options +FollowSymlinks
RewriteEngine on
rewritecond %{http_host} ^mydomain.com [nc]
rewriterule ^(.*)$ http://www.mydomain.com/$1 [r=301,nc]

0

我建议大家坚持以下方法,它只会重定向主域名,而不会影响您主机中的任何其他子目录或子域名。

# Redirect non-www to www only for main domain 
# recommended if you have any/some sub-domain(s)
RewriteEngine on
RewriteBase /

# Replace yoursite and .tld respectively
RewriteCond %{HTTP_HOST} ^yoursite\.tld$
# Replace yoursite.com
RewriteRule ^(.*) http://www.yoursite.com/$1 [R=301]

如果您确定并且希望永远不会在您的网站上使用子域名,例如subdomain.yoursite.com或其他类似的情况,请使用以下方法。 “再次强调,请确保您真的想使用这种方法。”

# Redirect all non-www to www including subdomain(s)
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

下面的方法将重定向所有www网址到非www,包括您的子域名,尽管您不能使用www.subdirecty.yoursite.com,它会提示您一个500错误。
# Redirect www to non-www
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接