htaccess 强制 https 并将 www 重定向到非 www,但没有其他子域
Posted
技术标签:
【中文标题】htaccess 强制 https 并将 www 重定向到非 www,但没有其他子域【英文标题】:htaccess force https and redirect www to non-www, but no other subdomains 【发布时间】:2014-02-23 09:29:46 【问题描述】:我知道有很多类似的线程,但似乎没有一个符合我的确切问题。这是我想要做的:
(1) http://www.mydomain.com/ -> https://mydomain.com/
(2) http://mydomain.com/ -> https://mydomain.com/
(3) https://www.mydomain.com -> https://mydomain.com/
理想情况下,如果我将添加更多子域,我也想涵盖这种情况,以自动表现如下(最好以适用于我添加的任何子域的通用方式)。
(4) http://sub.mydomain.com/ -> https://sub.mydomain.com/
此时我想知道是否有可能创建一个 .htaccess 文件来完成我需要的一切,尽管我必须承认我了解正则表达式,但我并不完全是 mod_rewrite uberpro。
以下是我已经尝试过的解决方案:
Force non-www and https via htaccess 某种作品,但似乎会产生重定向循环 .htaccess redirect www to non-www with SSL/HTTPS 适用于 (1) 和 (3),但不适用于 (2) htaccess force www to non-www with consideration of http or https 针对 (1) 重定向到 http://mydomain.com/(不带 https) 对 (2) 无能为力 针对 (3) 重定向到 http://mydomain.com/(不带 https)我的 SSL 证书涵盖 www 子域,所以我不是在寻找“不受信任的连接”错误解决方案,我知道这是不可能的。
【问题讨论】:
【参考方案1】:我发现当您有 https://www.example.com 并重定向到 https://example.com 的内容时,大多数建议都没有被采纳。
以下适用于所有排列:
RewriteEngine On
# match any URL with www and rewrite it to https without the www
RewriteCond %HTTP_HOST ^(www\.)(.*) [NC]
RewriteRule (.*) https://%2%REQUEST_URI [L,R=301]
# match urls that are non https (without the www)
RewriteCond %HTTPS off
RewriteCond %HTTP_HOST !^(www\.)(.*) [NC]
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [L,R=301]
希望这对某人有所帮助!
【讨论】:
作为.htaccess
文件为我工作;但在虚拟主机配置文件下的<Directory>
块中使用时,仍然没有将https://www.example.com
重定向到https://example.com
。知道如何适应这种情况吗?
请忽略我最后的评论。我的重定向逻辑被letsencrypt(certbot)生成的另一个虚拟主机覆盖;当我将它们添加到我的 *:80
和 *:443
虚拟主机下的 <Directory>
块时,您的重写规则对我有用。
此解决方案处理将https://www.example.com
重写为https://example.com
。我还必须将它包含在 *:80
和 *:443
虚拟主机中才能使其正常工作。【参考方案2】:
将此代码放入您的DOCUMENT_ROOT/.htaccess
文件中:
RewriteEngine On
RewriteCond %HTTPS off
RewriteCond %ENV:HTTPS off
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301,NE]
RewriteCond %HTTP_HOST ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%REQUEST_URI [L,R=301,NE]
【讨论】:
虽然这似乎完成了将所有内容重定向到mydomain.com 的工作,但似乎正在进行的重定向太多了。详细地说,这是浏览器告诉我的 (1) 到 (3) 的内容,包括所需的重定向目标:Opera: 301 Moved Permanently。该文档已移至此处(链接到mydomain.com,导致相同的结果) Chromium:此网页有一个重定向循环 Firefox:该页面未正确重定向。 […] 以一种永远不会完成的方式。这可能是由重写规则中的 redirect=301 引起的吗? 抱歉,我仍然遇到同样的问题。我希望这不是我做错并且不知道的其他事情(当然,在再次测试之前,我从浏览器中擦除了所有缓存的数据、cookie 等)。也许我会只强制使用 https 并将 www 子域作为互联网历史的剩余部分......也许它毕竟不是那么重要。不过,非常感谢您为我编写了一个不错的通用 htaccess 文件所做的努力,我很感激。 是的,我刚刚尝试了一个带有一些新浏览器的全新虚拟机,绝对没有任何历史记录。仍然得到重定向循环:-( 嗯……似乎比我想象的要难。我只有静态 html 文件用于在这个新的网络空间中进行测试,没有 CMS、CGI 脚本或使用 mod_rewrite 的东西,它们可能会干扰这个 .htaccess 中的规则。我现在在我的主机上打开了一张支持票,告诉他们我正在尝试做什么,并询问他们是否有任何可能妨碍我的全局配置。让我们看看他们怎么说! 原来%HTTPS
是 mod_ssl 的一个功能,它没有在我的主机上运行。相反,他们使用磅作为 HTTPS 前端,它提供环境变量 %ENV:HTTPS
。因此,我添加了一行来检查这一点,并将旧的留在其中以处理旧设置。我最终工作的 .htaccess 现在看起来像这样:RewriteEngine On RewriteCond %HTTPS !=on RewriteCond %ENV:HTTPS !=on RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301,NE] RewriteCond %HTTP_HOST ^www\.(.+)$ [NC] RewriteRule ^ https://%1%REQUEST_URI [L,R=301,NE]
【参考方案3】:
强制使用 HTTPS
Options +FollowSymLinks
RewriteEngine On
RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI
强制 www 为非 www
Options +FollowSymLinks
RewriteEngine On
RewriteCond %HTTP_HOST ^www.bewebdeveloper.com$
RewriteRule ^(.*) http://bewebdeveloper.com/$1 [QSA,L,R=301]
【讨论】:
【参考方案4】:RewriteEngine on
RewriteCond %HTTPS off [OR]
RewriteCond %HTTP_HOST ^www\.([^.]+\.[^.]+)$ [NC]
RewriteRule ^ https://%1%REQUEST_URI [L,R=301,NE]
此脚本将重定向
http://domain.com http://www.domain.com https://www.domain.com到
https://domain.com同时保留子域。
【讨论】:
【参考方案5】:没有一个例子对我有用,它们似乎陷入了一个循环,但以下工作。
# match any URL with www and rewrite it to https without the www
RewriteCond %HTTP_HOST ^(www\.)(.*) [NC]
RewriteRule (.*) https://%2%REQUEST_URI [R=301,L]
# match non https and redirect to https
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteRule ^(.*)$ https://%HTTP_HOST/$1 [R=301,L]
顺序很重要,在某些情况下会阻止第三次重定向。
如果您想使用子域(除了 www.),只需删除第一个规则集。
所以对于子域,你所需要的只是
# match non https and redirect to https
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteRule ^(.*)$ https://%HTTP_HOST/$1 [R=301,L]
我使用 Cloudways 服务,我发现这是唯一有效的方法
【讨论】:
【参考方案6】:我发现以下答案符合您的要求:
www to non-www with https 但没有其他子域
RewriteEngine on
RewriteCond %HTTP_HOST ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %HTTPS !on
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R=301,L]
满足所有三 (3) 个条件:
(1) http://www.example.com/ -> https://example.com/
(2) http://example.com/ -> https://example.com/
(3) https://www.example.com -> https://example.com/
但除了www
之外没有其他子域,如下所示:
(4) http://others.example.com -> https://others.example.com/
(5) https://others.example.com -> https://others.example.com/
【讨论】:
【参考方案7】:只需将此代码添加到根 .htaccess 文件中
RewriteCond %HTTP_HOST ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
【讨论】:
以上是关于htaccess 强制 https 并将 www 重定向到非 www,但没有其他子域的主要内容,如果未能解决你的问题,请参考以下文章
.htaccess:在所有页面上强制 www,在一个页面上强制 https,在所有其他页面上强制 http
使用 .htaccess 为 CloudFlare 用户强制使用 HTTPS 和非 WWW
htaccess帮助,需要强制www,https,并删除index.php
使用 www 强制 HTTPS 并在 CodeIgniter 中删除 index.php .htaccess