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

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

改变你的配置(添加一个斜线):

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

或者下面列出的解决方案(由@ broken-mirror提出)将适用于任何域:

 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替换login或者你需要支持HTTPS的任何URL。

我认为这是一个坏主意,但。 为了推理, 请阅读这个答案 。

 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] 

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

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

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

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

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

这将重定向您的域名是不是开始与WWW它不是重定向您的所有子域。

这是有用的。

我相信最好的答案能够成功地将非www转向www(例如: mysite.com – > http://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,因为我目前没有测试证书,但是如果有人可以验证或优化我所拥有的那么棒。

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

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

可以从这里找到URL重定向教程 – 使用.htaccess文件重定向非www到www和HTTP到HTTPS

在配置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] 

写入.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] 

如果可能,将其添加到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解析每个请求,你的客户端浏览器将缓存重定向,所以他们永远不会(或很少)再次请求“错误”的网址,节省您的服务器负载。

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

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

希望这可以帮助别人:)