212

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

4

13 回答 13

424

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

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 或任何 URL。

我认为这是一个坏主意。有关推理,请阅读此答案

于 2012-08-21T08:09:31.820 回答
107

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

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

UPD.:对于类似的域.co.uk,替换

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+\.[^.]+$
于 2014-11-28T08:21:08.990 回答
88
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]
于 2014-03-10T12:08:41.370 回答
26

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

于 2016-04-23T07:26:35.653 回答
8

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

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]
于 2014-10-22T08:34:02.813 回答
5

我已经测试了上述所有解决方案,但对我不起作用,我试图删除 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>

希望这可以帮助某人:)

于 2017-05-11T12:57:55.143 回答
3

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

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

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

于 2015-10-28T11:16:13.633 回答
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]
于 2017-02-23T00:19:05.573 回答
2
RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteRule (.*) http://www.domain.com/$1 [L,R=301]

这将重定向您未以 WWW 开头的域它不会重定向您的所有子域。

它是有益的。

于 2015-01-19T19:35:51.577 回答
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,因为我目前没有要测试的证书,但是如果有人可以验证或优化我所拥有的,那就太棒了。

于 2015-02-10T09:03:20.143 回答
1

两个警告

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

避免 301

如果您真的需要永久重定向,请仔细考虑,[R=301]因为如果您决定稍后更改它,那么页面的先前访问者将继续看到原始重定向的页面。

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

也避免 302

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

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

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

于 2018-02-13T01:38:27.960 回答
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/。没有它,重定向 fromexample.com/asdf将重定向到http://www.example.comasdf而不是http://www.example.com/asdf.

于 2017-03-20T23:05:49.203 回答
-2

写入 .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]
于 2014-07-03T01:55:37.977 回答