在.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]
以下示例在ssl和non-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>
希望这可以帮助别人:)