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

时间:2012-08-21 08:04:39

标签: .htaccess

我在.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

13 个答案:

答案 0 :(得分:351)

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

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]

login替换为checkout.php或您需要支持HTTPS的任何网址。

我认为这是一个坏主意。推理please read this answer

答案 1 :(得分:79)

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]

答案 2 :(得分:78)

这是支持https和http:

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

答案 3 :(得分:22)

以下示例适用于 ssl 非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

答案 4 :(得分:7)

试试这个,我在很多网站上都使用它,它运作得很好

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

答案 5 :(得分:3)

在.htaccess文件中添加以下代码。

.aside {
    position: relative;
    float: left;
    width: 195px;
    top: 0px;
    bottom: 0px;
    background-color: #ebddca;
    height: 100%;
}

网址重定向教程可以在这里找到 - Redirect non-www to www & HTTP to HTTPS using .htaccess file

答案 6 :(得分:3)

此配置适用于配置了SSL的bitnami wordpress:

在&#34; RewriteEngine On&#34;下添加了以下内容。在文件/opt/bitnami/apps/wordpress/conf/httpd-app.conf

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]

答案 7 :(得分:3)

我已经测试了上述所有解决方案,但没有为我工作,我试图删除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 ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

希望这可以帮助某人:)

答案 8 :(得分:2)

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

这将重定向您的域名,该域名不是以WWW开头的 它不会重定向您的所有子域。

很有用。

答案 9 :(得分:2)

我认为最佳答案成功地将非www重定向到www(例如: mysite.com - &gt; 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,因为我目前没有可以测试的证书,但是如果有人可以验证或优化我拥有的那将是非常棒的。

答案 10 :(得分: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用于&#34; example.com&#34;捕获这些请求,然后将其永久重定向到您的主VirtualHost。因此,每次请求都没有REGEX解析,并且您的客户端浏览器将缓存重定向,因此他们永远不会(或很少)请求错误&#34;再次提供网址,节省服务器负载。

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

答案 11 :(得分:0)

两个警告

避免301并且更喜欢现代303或307响应状态代码。

避免301

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

永久重定向信息经常存储在浏览器的缓存中,并且通常很难消除(重新加载页面不能解决问题)。您的网站访问者将被卡在之前的重定向中,永远&#34;。

也避免使用302

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

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

您仍然可以使用代码302(非永久重定向),尽管它被认为是不明确的。在任何情况下,大多数浏览器都会以新302代码指示的方式实现303

答案 12 :(得分:-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]