.htaccess 使用 SSL/HTTPS 将 www 重定向到非 www

Posted

技术标签:

【中文标题】.htaccess 使用 SSL/HTTPS 将 www 重定向到非 www【英文标题】:.htaccess redirect www to non-www with SSL/HTTPS 【发布时间】:2010-12-01 11:31:30 【问题描述】:

我有多个域在一个 .htaccess 文件下运行,每个域都有一个 SSL 证书。

我需要在每个域上强制使用 https 前缀,同时还要确保 www 版本重定向到 no-www 版本。

下面是我的代码;它不起作用:

RewriteCond %HTTP_HOST ^www.%HTTP_HOST
RewriteRule ^.*$ https://%HTTP_HOST%REQUEST_URI/$1 [R=301,L]

我想要实现的是:将https://www.example.com 之类的东西重定向到https://example.com

我做错了什么,我该如何实现?

【问题讨论】:

希望这会有所帮助,它还解释了哪个也最适合 SEO。 wpza.net/redirect-wordpress-to-https-using-htaccess-file 【参考方案1】:

使用 https 的 www 到非 www

RewriteEngine on

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

RewriteCond %ENV:HTTPS !on
RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [R=301,L]

【讨论】:

“RewriteRule ^(.*)$ http://%1/$1 [R=301,L]”改为“RewriteRule ^(.*)$ https://%1/ $1 [R=301,L]" (by @KenVerhaegen) 否则“它将首先重定向到非 http,然后重定向到 https...所以现在我们可以避免可能触发的第二次重定向。” 真的很简单很搭配,这应该也是this question的正确答案 无论我尝试什么,它都不适用于 Safari 和 Firefox。铬没问题。任何解决方案都会有所帮助 - 我只有 example.com 的证书 - 不适用于 example.com @KalpeshPopat:这可能是因为您的浏览器缓存保存了您输入 URL 时的去向信息。只要 DNS/浏览器缓存更新,它就会工作。 这个答案在 2021 年有效吗?我试过了,但我在 Firefox 中收到错误“页面未正确重定向”。【参考方案2】:

参考:Apache redirect www to non-www and HTTP to HTTPS

http://example.com

http://www.example.com

https://www.example.com

https://example.com

RewriteEngine On
RewriteCond %HTTPS off [OR]
RewriteCond %HTTP_HOST ^www\. [NC]
RewriteCond %HTTP_HOST ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%REQUEST_URI [L,NE,R=301]

如果您希望默认 URL 为 www.example.com 而不是 example.com,则只需更改第三和第五行:

RewriteEngine On
RewriteCond %HTTPS off [OR]
RewriteCond %HTTP_HOST !^www\. [NC]
RewriteCond %HTTP_HOST ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%REQUEST_URI [L,NE,R=301]

【讨论】:

对于使用 HTTPS 重定向到非 WWW URL,第一部分的答案绝对完美,对我来说效果很好。 这么多年过去了,你的答案仍然是魅力。 这行得通。但请确保它位于 .htaccess 文件的顶部而不是下方,因为其他代码可能会覆盖它。 它不会将example.com重定向到example.com【参考方案3】:

你的条件永远不会成立,因为它就像“if (a == a + b)”。

我会尝试以下方法:

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

这会将“google.com”从“www.google.com”捕获到 %1,其余的在 $1 中,然后结合 2,当 HTTP_HOST 以 www 开头(带或不带 https)时。

【讨论】:

不幸的是,当有人尝试访问domain.com时,这仍然会产生“连接不受信任”错误 嗯,但它重定向正确?如果是,则可能是证书问题。 证书问题请参见this。 RewriteRule ^.*$ https://%1/$1 [R=301,L] 对我不起作用。如果我去mysite.com/some/path 它只是重定向到mysite.com 如果你把它改成 RewriteRule ^(.*)$ https://%1/$1 [R=301,L] (注意括号)然后它重定向果然mysite.com/some/path【参考方案4】:

要在单个请求中强制执行 non-wwwhttps,您可以在 htaccess 中使用以下规则:

RewriteEngine on

RewriteCond %HTTP_HOST ^www\. [OR]
RewriteCond %HTTPS off
RewriteCond %HTTP_HOST ^(?:www\.)?(.+)$
RewriteRule ^ https://%1%REQUEST_URI [NE,L,R]

这会将 http://www.example.com/https://www.example.com/ 重定向到 ssl 非 www https://example.com/

我使用 R 临时重定向标志来进行测试并避免浏览器缓存。如果您想永久重定向,只需将 R 标志更改为 R=301

【讨论】:

嗯,但是当我进入带有 www safari 的站点时,仍然说该页面不安全,并且歌剧不想将任何带有或不带有 www 的选项重定向到 ssl,为什么?【参考方案5】:
RewriteEngine On
RewriteCond %HTTPS off [OR]
RewriteCond %HTTP_HOST ^www\. [NC]
RewriteCond %HTTP_HOST ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%REQUEST_URI [L,NE,R=301]

这非常适合我!

【讨论】:

【参考方案6】:

证书必须涵盖 www 和非 www https。一些提供商的证书涵盖 www.xxxx.yyy 两者,但仅涵盖 xxxx.yyy 一个。

开启重写:

RewriteEngine On

让所有http使用https:

RewriteCond %SERVER_PORT 80
RewriteRule ^(.*)$ https://xxx.yyy/$1 [L,R=301]

只让 www https 使用非 www https:

RewriteCond %SERVER_PORT 443
RewriteCond %HTTP_HOST ^www[.].+$
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [L,R=301]

不能处理非www https,否则会出现循环。

在 [L,R=301]:

    L = 如果规则已处理,则不再处理。 R=301 = 告诉浏览器/机器人进行永久重定向。

更通用

一种更通用的方法——不依赖于端口——是:

RewriteCond %HTTP_HOST ^www\.
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA]

使用www 制作任何网址。

RewriteCond %HTTPS !on
RewriteCond %HTTPS !1
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteCond %HTTP:X-Forwarded-SSL !on
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA]

要强制使用任何非 https 的 URL,即使对于那些从丢弃 https 的负载平衡器下游的系统,请使用 https。

请注意,我还没有测试过forwarded 选项,因此如果您遇到任何问题,我们将不胜感激。如果您的系统不在负载均衡器后面,则可以省略这些行。

是否到 HTTP_HOST

您可以使用$HTTP_HOST 作为RewriteRule 中URL 的一部分,也可以使用明确的规范域名文本(上面的xxxx.yyy)。

明确指定域名可确保不会在用户提供的 URL 中使用任何不恰当的字符弯曲手段来欺骗您的网站做一些它可能没有准备好的事情,或者至少确保正确的无论打开页面的是哪个 URL 字符串,地址栏中都会显示域名。

它甚至可能有助于将 punycode 编码的域转换为在地址栏中显示正确的 unicode 字符。

【讨论】:

【参考方案7】:

这对我有用:

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

【讨论】:

【参考方案8】:
RewriteEngine On

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

RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]

经过多次试验和错误,这对我有用。第一部分来自上面的用户,将捕获 www.xxx.yyy 并发送到https://xxx.yyy

第 2 部分查看输入的 URL 并检查是否为 HTTPS,如果不是,则发送到 HTTPS

按此顺序完成,符合逻辑,不会出错。

这里是我在 WordPress 侧 htaccess 中的完整版本:

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

RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

【讨论】:

【参考方案9】:

对我来说最好将“example.com”硬编码为字符串,所以我需要更少的规则,即使你也可以使用它从 .org 重定向到 .com 或类似的:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %HTTP_HOST !^example\.com$ [NC]
  RewriteRule ^ https://example.com%REQUEST_URI [L,NE,R=301]
</IfModule>

【讨论】:

以上是关于.htaccess 使用 SSL/HTTPS 将 www 重定向到非 www的主要内容,如果未能解决你的问题,请参考以下文章

使用 .htaccess 和 mod_rewrite 强制 SSL/https

使用 .htaccess 对子域强制使用 SSL HTTPS

.htaccess url 重写用于 ssl https 重定向

使用 mod_rewrite 强制 SSL/HTTPS [重复]

在 Azure Web 应用程序上启用 SSL/HTTPS 的最佳方法是啥

HTTPS什么是SSL,HTTPS是如何工作的?