.htaccess-如何强制使用“ www。” 以一种通用的方式?


102

这将改变domain.comwww.domain.com

# Force the "www."
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

如何替换“域”部分,以便它可在任何域上使用?

Answers:


249

我会使用以下规则:

RewriteEngine On
RewriteCond %{HTTP_HOST} !=""
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

第一个条件检查Host值是否不为空(对于HTTP / 1.0);第二个检查主机值是否不以开头www.; HTTPS的第三检查(%{HTTPS}或者是onoff,因此%{HTTPS}s是任一onsoffs和在的情况下,onss被匹配)。然后,替换部分RewriteRule仅将信息部分合并到完整的URL。


31
仅当您要将所有子域都转发到www.yourdomain.com时,此解决方案才有效。如果只想强制使用www,则应将第二行更新为:RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
Jared Pomranky,

2
我没有使用问题中发布的规则将任何子域转发到www.mydomain.com
大声笑

3
非常聪明!我喜欢您强迫HTTPS检查在捕获组中返回“ S”,该捕获组在下一行中使用。非常优雅
code_monk

似乎就像一个通用答案,涵盖了HTTP和常规协议,就像一个魅力。
Clain Dsilva'3

1
谢谢!我将添加RewriteEngine On为第一行来完成它,因为如果原样复制粘贴,这可能会导致500服务器错误。
Ryan Casas 2015年


5

如果要将站点上所有非www的请求重定向到www版本,只需将以下代码添加到.htaccess文件中:

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

3

这不适用于子域。

domain.com正确地重定向到www.domain.com

images.domain.com重定向到www.images.domain.com

而不是检查子域是否不是“ www”,而要检查是否有两个点:

RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ HTTP%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

我喜欢这个解决方案。还是要通过.co.uk这样的TLD完成相同的工作?
TylersSN 2015年

1
@iUseMagentoNow仅增加点,例如:(RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\.(.*)\. [NC]严格来说,您的TLD仍然是,.uk而您的域名是something.co。)
mirabilos

在这种情况下,.co是二级域名,实际上并不属于您的域名的一部分,因为.uk是国家/地区代码TLD。老实说,在托管行业工作过,看到了新的域名格式,我看不到当前的TLD格式可以用于官方用途以外的任何其他用途。政府,组织等。在不久的将来,您可以以与目前的标准价格相似的价格注册fred.bloggs这样的fqdn,那么从DNS的角度来看,个人网站将看起来非常不同。
克里斯

1

以下内容应在没有任何请求的任何请求前添加“ www”前缀,并将已编辑的请求重定向到新的URI。

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

1
RewriteEngine On

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

这将重定向example.comwww.example.com排除子域。


对我来说,这似乎是将www.example.com发送到www.www.example.com哈哈
艾伯特·伦肖

@Albert也许是因为您的浏览器缓存。清除缓存并重试。
阿米特·维尔玛

你是对的!我只是使用无痕式(chrome),效果很好,谢谢!
艾伯特·伦肖

1
我非常喜欢这个通用规则。但是它对domain.co.uk不起作用, 因为它已经有两个点了。如何更改此规则以使其也适用于.co.uk?
Sacha Vorbeck'7

1
对于.co.uk和其他子cctlds,它的工作原理是:^([^。] + \。[^。] +)(\。(uk | ar | cy | ar | tr))?$,但不幸的是,有些混合像es这样的类型的tlds(wiki.mozilla.org/TLD_List)允许domain.es以及domain.com.es。将| es添加到正则表达式将匹配domain.es和www.domain.es,在此不需要。必须找到一种方法来处理这种混合类型的子cctlds
Sacha Vorbeck


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.