通用htaccess将www重定向到非www


484

我想重定向www.example.comexample.com。以下htaccess代码可实现此目的:

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

但是,有没有一种方法可以以通用的方式而不用对域名进行硬编码?


64
请务必注意,如果您不使用www(或其他子域),则所有cookie都将提交到每个子域,而您将无法使用无cookie子域来提供静态内容,从而减少了浏览器和服务器之间来回发送的数据量。您稍后可能会后悔的事情:twitter.com/codinghorror/statuses/1637428313
Sam Hasler 2009年

3
要考虑的另一件事,请确保在页面中设置标准名称而不带www,以避免可能出现的重复内容损失。另外,如果您的链接中有绝对URL,请确保它们也不都是www。
杰里米·摩根

在我看来,最好保留明确的重定向,尤其是在复制另一个域的配置时,这可能需要不同的调整(在某些情况下,www域更好)weboptimizer.ch/2014/01/redirection-www
雪花

为什么该解决方案在除root url之外的所有情况下都适用?例如,domain.com并不指定到domain.com,而domain.com/page1确实重定向到domain.com/page1
杰夫·所罗门

如果您希望在维护协议(HTTP或HTTPS)的同时将www重定向到非www,则请参阅以下相关问题:在维护协议HTTP或HTTPS的同时将www重定向到非www
MrWhite

Answers:


894
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

如同 迈克尔的除了这一作品:P


16
如果它不起作用,则可能是缺少RewriteEngine On使它起作用的先驱。
亨德利2010年

8
@Ben,我将如何反向使用它来 www 添加到非www网站?
anarkhos 2011年

18
它重定向http://www.domain.com/http://domain.com//。您应该添加/到中RewruteRule。这对我有用RewriteRule ^/(.*)$ http://%1/$1 [R=301,L]
弗拉基米尔·普鲁德尼科夫(Fladimir Prudnikov)

13
通过重定向到http://domain.com//双斜杠,我遇到了与弗拉基米尔相同的问题。所以我做到了RewriteRule ^(.*)$ http://%1$1 [R=301,L] ,到目前为止似乎还
行得通

5
请使用下面的解决方案,而不是重写引擎,它更快,同时优雅:stackoverflow.com/questions/1100343/...
贝拉

111

但是,如果我们需要对单独的http和https执行此操作:

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

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

2
www.example.com/重定向到example.com//是否可以删除多余的斜杠?
Bobby S

好问题。我想快速解决方案是在上述这些规则之前使用其他规则(即仅针对这种情况)。例如: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron

3
@BobbyS我在本文中使用了解决方案。它将www和HTTP重定向到非www HTTPS并处理尾随/
totymedli

如果将这些指令直接放在服务器配置(或virtualhost)中,则只会得到一个额外的斜线(在URL路径的开头)。在.htaccess你不应该得到一个额外的斜线。(请注意,如果要在服务器配置中执行此重定向,则可能不应该使用mod_rewrite开头... Redirect在适当的vhost容器中使用简单的mod_alias 会更有效,并且更不容易出错。)
怀特先生

72

非www重定向到www(均为:http + https)

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

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

4
@nightcoder这是因为我针对反向重定向(从非www到www)的解决方案,而不是Andron的解决方案
Dmitriy

2
注意:如果您打算将子域名用于其他目的,此解决方案可能会导致一些问题。例如,app.yourdomain.com将被重定向到www.app.yourdomain.com。
张敏(Marty

1
这与对问题的答案完全相反。
约翰·

我必须添加RewriteEngine OnRewriteBase /,但否则效果很好。
凌晨


33

以下是将www URL重定向到no-www的规则:

#########################
# redirect www to no-www
#########################

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

以下是将无www网址重定向到www的规则:

#########################
# redirect no-www to www
#########################

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

请注意,我使用NE标志来防止apache转义查询字符串。如果没有此标志,则apache会将请求的URL更改http://www.example.com/?foo%20barhttp://www.example.com/?foo%2250bar


1
您是否可以编写代码以将http重定向到https以及将www重定向到非www的问题
HYDER ALI

将http://更改为https://,以便在更改时将其强制为HTTPS。您还需要为未被这些规则重定向的流量添加常规的http-> https重定向。
diamondsea

11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

RewriteCond捕捉一切都在HTTP_HOST变化www.并保存在%1

RewriteRule捕获没有领先的URL /并保存在$1


1
sans leading "/"-在.htaccess(如问题所述)中,没有前导/,因此模式永远不会匹配,重定向也不会发生。(在服务器虚拟主机上下文中只有一个斜杠。)此外,如果在此之后有任何mod_rewrite指令,则将需要该L标志。
怀特先生

7

尝试这个:

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

如果主机以www开头,则将整个主机粘贴到URL的开头,然后删除“ www”。


1
RoBorg,不幸的是,如果我尝试这样做,您的设置将无法正常工作:example.com/hello/world我到这里为止:example.com/hello/world/world 我还必须在%{HTTP_POST}之后添加斜杠第一个RewriteRule
深井

2
我正在使用Apache / 2.2.9(Unix)。它适用于www.website时会被重定向到网站,但以下:网站/测试 - >去: websitetest我加入另一个/第二个错误固定的:网站/测试/ Nwebsitetest / N / N
深孔

1
与@deepwell与此问题相同。
neemzy 2014年

早期读者遇到的问题是因为这些指令是针对服务器配置(或vhost)的,而不是针对服务器的.htaccess。在目录上下文(.htaccess)中,您应该将第一个更改为RewriteRule:(RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI]需要Apache 2.2.12+)。请注意,添加了斜杠和DPI(Discard Path Info)标志-以防止部分URL路径看起来重复(实际上是“ path-info”),如先前的注释所述。但是,还有更简单的指令-如其他答案所述。
MrWhite

7

完整的通用WWW处理程序,http / https

我没有找到完整的答案。我用它来处理WWW收录。

  1. 通用。不需要域名信息。
  2. 在主要域上强制WWW:www.domain.com
  3. 删除子域上的WWW:sub.domain.com
  4. 保留HTTP / HTTPS状态。
  5. 允许单个Cookie用于域/子域

请让我知道这是如何工作的,或者是否留下漏洞。

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]

原始问题要求重定向www到non- www。您正在强迫加入www
瓦迪姆

6

我发现有关htaccess重定向的信息可能很多。首先,请确保您的站点在使用Apache的Unix上运行,而不是在Windows主机上运行(如果您希望此代码可以运行)。

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

(不过,请确保每行文本之间没有行间距;我在行之间添加了额外的间距,以便在此窗口中可以正常显示。)

这是一小段代码,可用于将网站的www版本定向到http://版本。也可以使用其他类似的代码。


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

对于子文件夹


3

对于那些无需使用“ www”前缀即可访问整个网站的用户。

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

母马确保将其添加到以下文件

/site/location/.htaccess 

本示例不完整-您未设置protossl环境变量(这不是标准/服务器变量)。该字段将始终为空,因此将始终重定向至http。(protossl在代码中更早设置的想法是要在重定向时保留协议。但是,这些天您可能应该一直重定向到https。)
MrWhite

3

使用.htaccess重定向到www或非www:

只需将以下代码行放入主根.htaccess文件中。在这两种情况下,只需将domain.com更改为您自己的主机名即可。

重定向到www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.com [NC]
  RewriteRule ^(.*)$ http://wwwDOTdomainDOtcom/$1 [L,R=301]
</IfModule>

重定向到非www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
  RewriteRule ^(.*)$ http://domainDOTcom/$1 [L,R=301]
</IfModule>

将DOT更改为=>。!!!


2

我使用上述规则将www转换为no www,但对于首页来说效果很好,但是在内部页面上,它们正转发到/index.php

我在我的.htaccess文件中找到了这条其他规则,这是造成此问题的原因,但不确定如何处理。任何建议都会很棒:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]

您需要在引用之前放置非www重定向规则。
弗拉基米尔·乔瓦诺维奇


2
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

如果你想删除www两个httphttps,使用以下命令:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://example.com%{REQUEST_URI} [NE,L,R]

这将重定向非SSL

和SSL

在apache上,2.4.*您可以使用Redirectwith if指令完成此操作,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>

2

用途:JavaScript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

或.htaccess:

RewriteEngine On
RewriteBase /
Rewritecond %{HTTP_HOST} ^www\.yoursite\.com$ [NC]
RewriteRule ^(.*)$ https://yoursite.com/$1 [R=301,L]

和PHP方法:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

阿贾克斯

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});

1

我让它工作的唯一途径...

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

1

如果您强迫www。在url中或强制使用ssl协议,然后尝试在htaccess文件中使用可能的变体,例如:

RewriteEngine开
RewriteBase /

###强制WWW ###

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

##强制SSL ###

RewriteCond%{SERVER_PORT} 80 
RewriteRule ^(。*)$ https://example.com/$1 [R,L]

##阻止IP的###
拒绝订单,允许
拒绝自256.251.0.139
拒绝来自199.127.0.259

Apache可以侦听另一个端口,例如81。因此,RewriteCond %{SERVER_PORT} 80我建议使用更通用的检查:RewriteCond %{HTTPS} off
Andron 2015年

1

选定的答案和许多其他解决方案在这里将URL的部分放在/后面,因此基本上它总是重定向到主域,至少对我来说如此。因此,我在斜线后添加了尊重完整路径的工作示例。

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

1

如果.htaccess自定义不是理想的选择,请使用其他方法:

我已经创建了供公众使用的简单重定向服务器。只需添加A或CNAME记录:

CNAME   r.simpleredirect.net
A       89.221.218.22

更多信息:https//simpleredirect.net


0

我不确定为什么要删除www。但是反向版本将是:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

该脚本的优点是:如果您有test.whattimein.com之类的东西或其他任何东西(用于开发/测试的环境),它将不会将U重定向到原始环境。


2
是否应包含www子域名实际上是个人喜好问题,它取决于域名和目标受众。上面发布的用于将www重定向到none-www的通用代码也可以处理测试环境,因为重定向仅在“ www”时发生。遇到子域。
MrWhite 2012年

1
这个问题的作用与用户的要求相反,后者只会污染帖子。
瓦迪姆

0

这已更新为可在Apache 2.4上使用:

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

Michael相比,唯一的变化是删除了[NC],这会产生“ AH00665”错误:

非正则表达式模式-f的NoCase选项不受支持,将被忽略


较早的答案不需要“更新以在Apache 2.4上工作”。您引用的“警告”(AH00665)与另一个指令(例如,如果您有类似的东西RewriteCond %{REQUEST_FILENAME} !-f [NC])相关。该NC标志在上面没有什么区别,但是,在此处使用该NC标志的原因是为了捕获一小部分(错误地)发送大写主机名的僵尸网络流量。
MrWhite

0

如果是localhost,则添加,忽略重定向(出于本地环境的开发目的)。如果不是localhost AND(不是https或www),则重定向到https和非www。

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

请详细说明您的代码,以便OP理解这是如何回答问题的。
RyanNerd

-2

嗨,您可以在htaccess文件上使用以下规则:

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

问题是要寻求一种不包含域名的“通用”解决方案。您的解决方案也问题中所要求的完全相反(非www到www,而不是www到非www),没有任何解释。
怀特先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.