将非www重定向到.htaccess中的www


189

我的.htaccess文件中有此文件:

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

但是每当我访问根目录下的文件时,该文件http://example.com/robots.txt都会重定向到http://www.example.comrobots.txt/

我该如何纠正它,以便将其正确重定向到http://www.example.com/robots.txt

Answers:


389

将您的配置更改为此(添加斜线):

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

或者下面概述的解决方案(由@absiddiqueLive提出)将适用于任何域:

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

如果需要支持http和https并保留协议选择,请尝试以下操作:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

在其中替换logincheckout.php或需要支持HTTPS的任何URL。

我认为这是个坏主意。对于推理,请阅读此答案


当某些页面(例如登录或注册)使用https协议时,此解决方案不起作用。
Alexey Kosov 2014年

我已对该帖子进行了小幅更新,以包含一些信息。通用和正确选择要使用的协议都很困难。
Randall Hunt 2014年

2
第一种解决方案重定向不够,第二种似乎重定向过多。例如blog.example.com成为www.blog.example.com
gman

您还可以添加在本地主机上开发时如何避免重定向的方法吗?
Bugs Bunny

香港专业教育学院一直在这里的一切,但没有任何工作。我正在使用laravel安装程序。有谁知道为什么这对我不起作用?www.domain.com和domain.com都可以正确加载,但是domain.com不会重定向到www.domain.com。这可能是我的DNS问题吗?
你好,世界

92

这是支持https和http的正确解决方案:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

7
这是完美的,它也不会www像其他通用解决方案那样将子域重定向。
Fabian Schmengler,2015年

4
这是最好的解决方案,比公认的答案要好得多,并且可以正确处理HTTPS
Tamik Soziev 2015年

3
完美的作品!在这么几行中!
zeckdude

7
这是最佳答案
安德鲁

7
如果我没记错的话,这将不止一个点。示例:yoursite.co.uk
TrashyMcTrash

82
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

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

对于Https

RewriteCond %{HTTPS}s ^on(s)|

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

7
此解决方案优于@ranman的解决方案,因为它适用于所有领域,从而可以在为新项目实现代码或为现有项目实现额外域时最大限度地减少人为错误。
弗兰基(Frankie)2014年

我更喜欢这种解决方案,但是为什么要^(.*)$代替(.*)呢?
Popnoodles

这个解决方案更好,但是我也编辑了我的包含的内容。
Randall Hunt 2014年

1
这对于所有领域都是简单有效的!谢谢
eirenaios 2015年

您可以关注RewriteCond%{HTTPS} s ^ on(s)| RewriteRule ^ http%1://www.% {HTTP_HOST} / $ 1 [R = 301,L]
absiddiqueLive 2015年

23

以下示例在sslnon-ssl上均适用,并且由于您仅使用一条规则来管理http和https,因此速度更快

RewriteEngine on


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

[已测试]

这将重定向

http

https


1
非常接近我的想法。HTTP主机中也支持多个点,例如“ mysite.co.uk”。
Adambean '16

2
出于好奇,您为什么不在这里使用R = 301?如果未指定代码,则默认情况下将使用302(移动温度)。
Marc

1
完美运作。这应该是公认的答案。
James Nisbet

8

试试这个,我在很多网站上都用过,效果很好

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]

4

我已经测试了上述所有解决方案,但对我不起作用,我尝试删除http://,并且也不会重定向,也很好地删除了www重定向,所以我很困惑,特别是我在https下运行所有​​网站://

因此,我将一些代码组合在一起,并为http://和https://以及www和非www提供了完美的解决方案。

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

希望这可以帮助某人:)



3

此配置在具有SSL配置的bitnami wordpress中为我工作:

在文件/opt/bitnami/apps/wordpress/conf/httpd-app.conf中的“ RewriteEngine On”下添加了以下内容

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


2

我认为,最佳答案可以成功地将非www重定向到www(例如:mysite.com-> www.mysite.com),但不考虑通配符子域,从而导致:

random.mysite.com -> www.random.mysite.com

这是带有/不带有HTTPS的解决方案

HTTP

RewriteEngine On

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

HTTP / HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

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

*注:我尚未测试https,因为我目前没有要测试的证书,但是如果有人可以验证或优化我所拥有的证书,那真是太棒了。


第一个$在这里做什么:'^(。*)$'
Vaishal Patel

0

如果可能,将其添加到主Apache配置文件中。它是一种重量更轻的解决方案,所需的处理更少。

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin me@example.com
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

因此,VirtualHost“ example.com” 的单独名称将捕获这些请求,然后将其永久重定向到您的main VirtualHost。因此,没有针对每个请求的REGEX解析,并且您的客户端浏览器将缓存重定向,因此它们再也不会(或很少)再次请求“错误的” URL,从而节省了服务器负载。

请注意,中的斜杠Redirect permanent / http://www.example.com/。如果没有它,则从example.com/asdf重定向将重定向到http://www.example.comasdf而不是http://www.example.com/asdf


0

两个警告

避免使用301,而应使用现代的303或307响应状态代码。

避免301

请仔细考虑您是否确实需要指示的永久重定向,[R=301]因为如果您决定稍后进行更改,则页面的先前访问者将继续看到原始重定向的页面。

永久重定向信息经常存储在浏览器的缓存中,通常很难消除(重新加载页面不能解决问题)。您的网站访问者将永远停留在以前的重定向中。

也避免302

HTTP协议(v1.1)的新版本添加了两个新的响应状态代码,可以代替302使用。

  • 303 URL重定向,但要求将请求类型更改为GET。
  • 307 URL重定向,但要求保留最初发送的请求类型。

您仍然可以使用该代码302(非永久重定向),尽管它被认为是模棱两可的。无论如何,大多数浏览器都302以新303代码指示的相同方式实现。


关于您有关301的警告,即使我们在谈论相同的域名,这也将适用吗?不确定在这种情况下如何应用...将所有URL从重定向http://example.com/testinghttp://www.example.com/testing。从长远来看,这可能是一个坏方法吗?谢谢,
Sara_

-1

用.htaccess编写:)

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

1
与其他答案相同
Ankit
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.