通过 htaccess 强制非 www 和 https

Posted

技术标签:

【中文标题】通过 htaccess 强制非 www 和 https【英文标题】:Force non-www and https via htaccess 【发布时间】:2011-09-14 21:17:21 【问题描述】:

我正在尝试强制将用户重定向到非 www 网站,并强制 https。

当输入 http 时,我已经完成了这项工作,但不强制使用 https。

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

关于我做错了什么有什么想法吗?

【问题讨论】:

【参考方案1】:

试试这个规则:

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

【讨论】:

当我尝试访问:https://www.mydomainname.co.uk 使用上面接受的答案中的 htaccess 时,我从浏览器收到旧的“已连接不受信任”消息。 http://mydomainname.co.ukhttp://www.mydomainname.co.uk 都可以重定向。我的证书是为mydomainname.co.uk 生成的。有什么想法(或您需要的更多信息)? @Jon:TLS/SSL 层位于 HTTP 之上(HTTPS 也称为“HTTP over TLS/SSL”)。因此,TLS/SSL 连接已建立,证书在传递给 HTTP 之前经过验证,并发生 HTTP 重定向。你无法解决这个问题。 感谢您的更新,只是为了确认一下 - 有没有解决方法吗? (完全没有,或者你知道吗?) @Jon:不,据我所知没有解决方案。 这会为我生成一个重定向循环。我发现这个答案可行:***.com/a/21467534/298218【参考方案2】:

基于 Gumbo 的评论:“TLS/SSL 连接已建立,证书在传递给 HTTP 和 HTTP 重定向发生之前经过验证” 我试了一下(似乎可行):

RewriteEngine On 
RewriteCond %SERVER_PORT 80 
RewriteRule ^(.*)$ https://www.blahblah.com/$1 [R,L]

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

如果这种方法有问题,请告诉我。

【讨论】:

【参考方案3】:

唯一对我有用的规则如下

# 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]

顺序很重要,它在某些情况下会阻止第三次重定向。

【讨论】:

【参考方案4】:

使用此代码,我从 http 和 www 以及无 www 重定向到 https 无 www。请注意在 htaccess 中插入代码的位置很重要:

RewriteEngine On
RewriteCond %HTTPS off
RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301]

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

【讨论】:

以上是关于通过 htaccess 强制非 www 和 https的主要内容,如果未能解决你的问题,请参考以下文章

使用 .htaccess 为 CloudFlare 用户强制使用 HTTPS 和非 WWW

通过 htaccess 将所有 http 和 https 非 www URL 重定向到 https://www.xyz.com

强制通过htaccess文件重定向到https

对使用 .htaccess 输入的任何 URI 强制使用 SSL 和 www 子域?

apache_conf 在htaccess中强制使用HTTPS和WWW

.htaccess:在所有页面上强制 www,在一个页面上强制 https,在所有其他页面上强制 http