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


当前回答

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]

其他回答

我已经测试了上面所有的解决方案,但不适合我,我已经尝试删除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>

希望这能帮助到一些人:)

如果可能的话,将其添加到主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

因此,“example.com”的独立VirtualHost捕获这些请求,然后永久地将它们重定向到您的主VirtualHost。因此,每个请求都不需要REGEX解析,您的客户端浏览器将缓存重定向,因此它们永远不会(或很少)再次请求“错误”的url,从而节省服务器负载。

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

下面的示例在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

http://example.com

to

http://www.example.com

https

https://example.com

to

https://www.example.com

我相信顶部的答案成功地重定向非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,因为我目前没有一个证书来测试,但如果有人可以验证或优化我所拥有的,那就太棒了。

更改您的配置如下(添加斜杠):

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]

你用checkout。php或者任何你需要支持HTTPS的URL替换login。

但我认为这不是一个好主意。关于推理,请阅读下面的答案。