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

apache_conf 在htaccess中强制使用HTTPS和WWW

htaccess使用https,非www和目录尾随将两个域重写为一个域