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

Posted

技术标签:

【中文标题】使用 .htaccess 为 CloudFlare 用户强制使用 HTTPS 和非 WWW【英文标题】:Force HTTPS and Non-WWW with .htaccess for CloudFlare Users 【发布时间】:2019-01-27 18:48:46 【问题描述】:

我正在使用 CloudFlare,我想通过使用 .htaccess 来强制使用 HTTPS 和非 WWW

我知道网上已经有很多例子了,但是对于 CloudFlare 用户来说,正常的重定向可能会导致重定向循环。

最接近的答案是这个:https://***.com/a/34065445/1254581

但它只强制 HTTPS,我也需要强制非 WWW。请帮助编辑此规则:

RewriteEngine On

# If we receive a forwarded http request from a proxy...
RewriteCond %HTTP:X-Forwarded-Proto =http [OR]

# ...or just a plain old http request directly from the client
RewriteCond %HTTP:X-Forwarded-Proto =""
RewriteCond %HTTPS !=on

# Redirect to https version
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]

# Put the rest of your rewrite rules here`enter code here`

【问题讨论】:

RewriteCond %HTTP_HOST ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] 诀窍是使用 CF 的 SSL='FULL' 设置并关闭其“始终使用 HTTPS”。 @Jules 你能解释一下为什么这可以解决重定向循环问题吗? 因为如果你使用“灵活”,你会得到这个循环:CF sends the request as http. Your server sends back a 301 for https. Your browser requests https. 所以不要使用灵活。而是在您的服务器上安装他们的免费来源证书并通过整个链建立 https。 @Jules 那么如果我们设置 SSL=FULL,CF 将始终以 HTTPS 发送请求?那为什么还要关闭“始终使用HTTPS”呢? 【参考方案1】:

借助 Cloudflare,您可以使用:

RewriteEngine On
# www -> https without www
RewriteCond %HTTP_HOST ^www\.(.+) [NC]
RewriteRule ^ https://%1%REQUEST_URI [NE,L,R=301]
# http -> https
# # With Cloudflare
RewriteCond %HTTP:CF-Visitor '"scheme":"http"'
# # Without Cloudflare
# RewriteCond %HTTPS off
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [NE,L,R=301]

【讨论】:

你知道为什么正常重定向会导致重定向循环吗? 是的,因为您收到来自 Cloudflare 服务器的请求,而不是用户,并且(取决于选项)它们不一定是 https 因为我使用 CF-Visitor 一个 Cloudflare 参数进行测试 但是如果我们更改或关闭CDN会失败,不是完美的解决方案。 您可以激活 Cloudflare 模式 Full SSL。并为 SSL RewriteCond %HTTPS offRewriteRule ^ https://%HTTP_HOST%REQUEST_URI [NE,L,R=301] 添加“正常测试”,这永远不会导致循环,因为在严格模式下,Cloudflare 永远不会在没有 SSL 的情况下连接

以上是关于使用 .htaccess 为 CloudFlare 用户强制使用 HTTPS 和非 WWW的主要内容,如果未能解决你的问题,请参考以下文章

Cloudflare DNS - 如何将所有子域重定向到根域?

如何强制使用 HTTPS(Cloudflare 灵活 SSL)?

在启用 CloudFlare 的情况下利用浏览器缓存

使用Cloudflare的Drupal 7上的CORS Access-Control-Allow-Origin错误

Cloudflare 为 Cloudflare 页面去除自定义域上的标头

将 Cloudflare 配置为指向 AWS Amplify