我的网站似乎没有从非www重定向到www。

我的Apache配置如下:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/ [r=301,nc] 


我想念什么?

评论

对于基于.htaccess的解决方案,我建议针对直径问题提出一个答案:stackoverflow.com/a/5262044/367456

这很好,它的确在网址中添加了斜杠,因此在美元之前就失去了斜杠。
通用htaccess的可能重复项将www重定向到非www

#1 楼

使用重写引擎是解决此问题的非常重要的方法。这是一个更简单的解决方案:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>


然后您将看到另一个<VirtualHost>部分,其中ServerName www.example.com用于您的真实服务器配置。当使用/指令时,Apache会自动在Redirect之后保留所有内容,这是一个常见的误解,即为什么此方法不起作用(实际上可以)。

评论


对于具有ssl虚拟主机的网站,您该怎么做?

–披风
2010年12月11日在16:16

使用此建议时,出现错误“ example.com上的网页导致太多重定向”。别人有这个问题吗?

–乔纳森·伯格(Jonathan Berger)
2011-3-28在19:38

@BlackDivine:在另一个方向上进行操作并没有什么神奇之处。只需将www.example和example替换为它们出现在示例中的任何位置即可。

– Greg Hewgill
2012年2月12日在21:17

@JonathanBerger如果重定向太多,则可能是文件配置不正确。确保具有2个VirtualHost:一个带有非www的虚拟主机(上面是一个),另一个带有ServerName www.example.com的虚拟主机(具有实际配置)。另外,还要确保在www.example.com配置中也没有重定向(mod_alias和mod_rewrite)。

– Savas Vedova
13年8月4日在8:03

对于一个虚拟主机服务器,例如example.com,我有Redirect 301 / http://example2.com/extra/,但是当它重定向时,它会丢失尾部的斜杠,这意味着example.com/blah会转到example2.com/ Extrablah。有任何想法吗? (Apache 2.2.22)

–彼得·豪
2014年1月8日在16:45



#2 楼

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

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


评论


答案很短...但是要点...不确定是赞成还是反对票

–thecoshman
2012年10月11日上午10:01

哦,这很整洁,可以将其包含在顶级服务器配置中(如果是的话)将应用于每个虚拟主机!

–thenickdude
2014年8月19日在23:02

您好@burzumko您是如何实现的,这对于没有www的所有人都是正确的,但是让example.com/subdi1/ws/*在没有www的情况下进行检查?

–黑色老师
15年3月18日在13:08

我也将此解决方案用于HTTPS虚拟主机。只需在第三行的http中添加s即可。

–rodrigoap
17年9月12日在18:10

#3 楼

<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/
</VirtualHost>


评论


这对我没用;它导致了到同一站点的无限重定向循环

–dmiller309
2014年5月3日在6:09

@ dmiller309:您碰巧包含了www。在ServerAlias中?

–cherouvim
2014年5月3日在13:28

您说得对,我不小心把www。在ServerAlias中使用*。通配符。因为我弄乱了VirtualHost条目的顺序,所以*。我不认为通配符有机会比赛。

–dmiller309
2014年5月10日21:28



这是最佳答案,因为它很干净,可以保留路径(与答案1不同),并且不使用重写。

–schieferstapel
15年1月31日在9:35

#4 楼

要从www网站中删除URL,请在您的.htaccess文件中使用以下代码: />
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1 [R=301,L]


必须将www替换为URL

评论


最佳答案在这里,因为它适用于多个域名<3的网站

– Clement Herreman
2012年7月4日15:03

.html的第二部分是什么?

– Nathan H
2012年12月4日13:16

在$ 1之前删除斜杠,以便在重定向后没有双斜杠(//)=> RewriteRule ^(。*)$ yourSite.com $ 1 [R = 301]

–凯文·坎皮恩(Kevin Campion)
2013年1月7日15:40

#5 楼

    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>


上面的代码就是这样。第一个虚拟主机块检查请求是否为www.example.com并在该目录中运行您的网站。

失败,它出现在第二个虚拟主机部分。在这里,除了www.example.com以外的任何内容都将重定向到www.example.com。

这里的顺序很重要。如果您先添加第二个virtualhost指令,则将导致重定向循环。

此解决方案会将任何请求重定向到您的域,即www.yourdomain.com。 !

#6 楼

这与许多其他建议相似,但有一些改进:方案(http / https),并且忽略先前的%{REQUEST_URI}规则的影响。 br />

评论


几乎完美。它必须是%{HTTP_HOST} $ 1,而不是%{HTTP_HOST} / $ 1(否则它将使斜杠加倍)

– Michael Wyraz
16-3-13在15:49

@Michael Wyraz:这里的斜线不加倍吗?

–not2精明
18/12/5在12:42

#7 楼

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


这从HTTP_HOST变量开始,该变量仅包含传入URL的域名部分(example.com)。假设域名不包含www.且与您的域名完全匹配,则RewriteRule起作用。模式^(.*)$将匹配REQUEST_URI中的所有内容,foo/blah/index.html是HTTP请求(www)中请求的资源。它将其存储在反向引用中,该反向引用随后用于重写具有新域名的URL(以[NC]开头的域名)。

[R=301]表示不区分大小写的模式匹配,[L]表示外部重定向使用代码301(资源已永久移动),并且q4312079q停止所有进一步的重写,并立即重定向。

#8 楼

如果您使用的是Apache 2.4,则无需启用重写apache模块,则可以使用以下代码:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>


评论


被低估的答案。使用此方法,可以避免其他虚拟主机,这对于自动化的Let'sEncrypt脚本是有好处的。

– Paul
19年4月4日在11:33

另外,如果您使用的是ANSIBLE,则从ANSIBLE 2.0开始,您现在可以轻松地在一个任务中将块插入文件中,更多详细信息请参见docs.ansible.com/ansible/2.5/modules/blockinfile_module.html

–sys0dm1n
19年6月6日在8:21



#9 楼

非www => www和相反www => non-www的重定向代码。 .htaccess文件中没有硬编码域和方案。因此,将保留原始域和http / https版本。

APACHE 2.4和更高版本

非WWW => WWW:

 RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
 


WWW =>非WWW:

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


注意:在%{REQUEST_SCHEME}不可用的Apache 2.2上不起作用。为了与Apache 2.2兼容,请使用以下代码,或将%{REQUEST_SCHEME}替换为固定的http / https。


APACHE 2.2和更高版本

NON-WWW => WWW :

 RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
 


...或更短的版本...

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


WWW =>非WWW:

 RewriteEngine On

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

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


...不可能使用较短的版本,因为%N仅在上次RewriteCond中可用...

评论


Apache 2.4 config解决了该问题,谢谢您的答复。

– KimchiMan
19年11月2日,16:50

#10 楼

我运行了它。 标签。 (目录是所有docroot的父目录) httpd.apache.org/docs/2.2/mod/mod_rewrite.html说的只是主机和端口之后的内容。

#11 楼

将domain.tld重定向到www。

可以在Apache指令或.htaccess文件中添加以下行:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]



其他sudomain仍在工作。
无需调整行数。只需将它们复制/粘贴到正确的位置即可。

如果您修改了虚拟主机,请不要忘记应用apache更改。

(基于默认的Drupal7 .htaccess,应该在很多情况下都可以工作)

#12 楼

这很简单!

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


#13 楼

<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/
</VirtualHost>


这不仅会重定向域名,还会重定向内部的
页面,例如...
example.com/abcd.html www.example.com /abcd.html example.com/ab/cd.html?ef=gh ==> www.example.com/ab/cd.html?ef=gh

评论


谢谢你很有帮助。

–安东尼
16年1月24日在17:32

#14 楼

试试这个:

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


#15 楼

不要总是使用Redirect permanent(否则将来可能会引起问题)
如果以后有机会添加子域,请不要使用redirect permanent
因为客户端使用的子域名不会被注册为VirtualHost,即使稍后再注册,他也可能永远也不会到达此子域。
redirect permanent向客户端(浏览器)发送HTTP 301 Moved Permanently,并且其中很多人永远缓存此响应(直到缓存被清除[手动])。因此,使用该子域将始终自动重定向到www。***,而无需再次请求服务器。
请参阅浏览器将HTTP 301缓存多长时间?
所以只需使用Redirect
<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache .org-何时不使用mod_rewrite
Apache.org-规范主机名

#16 楼

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

检查此完美作品

#17 楼

-如果您托管多个域名(可选)
-如果所有这些域名都使用https(应有的话)
-如果您希望所有这些域名都使用www点domainName
将避免双重重定向(从http://非www到http:// www,然后再到https:// www)。
代码301到最方便的一个

#18 楼

我只是有一个同样的问题。
但是用这个解决了

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

此规则将非www重定向到www。 -www

RewriteEngine On RewriteCond %{HTTP_HOST} !^my-domain\.com$ [NC] RewriteRule ^(.*)$ http://my-domain.com/ [R=301,L]

请参阅http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess /

#19 楼

这对我有用:

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


将所有域重定向到(?!www.domain.com)子域时,为了避免无限重定向,我使用先行模式www排除了www子域在Apache中循环。

#20 楼

我使用的代码是:

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


#21 楼

要301将直接发送到该域的所有请求重定向到www,您可以使用:
RewriteEngine On

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

的好处是,如果您有任何有效的子域,例如
example.com,则此方法将有效至www.example.com bar.example.com否REDIRECT

#22 楼

如果使用上述两个带有不同<VirtualHost *:80> s的ServerName块的解决方案...

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>


...则必须同时设置NameVirtualHost On

如果不这样做,Apache不允许自己使用不同的ServerName来区分块,因此您会收到以下错误消息:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence


...或者没有重定向发生,或者您有无限的重定向循环,具体取决于您首先放置的块。

#23 楼

我在WP Multisite上有一个类似的任务,其中重定向规则必须是通用的(对于要添加到网络的任何给定域)。我首先解决了将通配符添加到域(停放域)的问题。注意。在.com之后。

CNAME * domain.com.


,然后将以下几行添加到多站点根目录的.htaccess文件中。我想这对任何网站都适用。

如果您想从非www重定向到www,请将最后一行更改为

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


#24 楼

我发现在使用多个虚拟主机时使用ServerAlias更加容易(并且更有用)。

评论


另一个过客小心解释一下,哦,httpd的强大之神,谁不介意解释低票?

–安东尼
15年8月25日在1:35

这样一来,您就可以拥有多个托管同一站点的域。根据您的情况和底层Web服务器的运行情况,您将遇到Cookie无法继续使用,人们感到困惑以及搜索引擎问题(将其视为2个不同的站点)的问题。

– Jeffrey Van Alstine
16-10-12在15:37