我在.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
?
答案 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响应状态代码。
请仔细考虑是否确实需要指示为[R=301]
的永久重定向,因为如果您决定稍后更改,则该页面的先前访问者将继续看到原始重定向的页面。
永久重定向信息经常存储在浏览器的缓存中,并且通常很难消除(重新加载页面不能解决问题)。您的网站访问者将被卡在之前的重定向中,永远&#34;。
新版本的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]