我的Apache配置如下:
RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/ [r=301,nc]
我想念什么?
#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 楼
我运行了它。#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
#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
评论
对于基于.htaccess的解决方案,我建议针对直径问题提出一个答案:stackoverflow.com/a/5262044/367456这很好,它的确在网址中添加了斜杠,因此在美元之前就失去了斜杠。
通用htaccess的可能重复项将www重定向到非www