使用 .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 off
和 RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [NE,L,R=301]
添加“正常测试”,这永远不会导致循环,因为在严格模式下,Cloudflare 永远不会在没有 SSL 的情况下连接以上是关于使用 .htaccess 为 CloudFlare 用户强制使用 HTTPS 和非 WWW的主要内容,如果未能解决你的问题,请参考以下文章
Cloudflare DNS - 如何将所有子域重定向到根域?
如何强制使用 HTTPS(Cloudflare 灵活 SSL)?
使用Cloudflare的Drupal 7上的CORS Access-Control-Allow-Origin错误