![使用 .htaccess 将 http 重定向到 https 失败](https://linux22.com/image/698822/%E4%BD%BF%E7%94%A8%20.htaccess%20%E5%B0%86%20http%20%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%20https%20%E5%A4%B1%E8%B4%A5.png)
我有一个使用 CloudFlare 灵活 SLL 的网站,托管在 HostGator 上。
我想重定向全部HTTP 请求到相应的 HTTPS URL。没有例外。我打算将规则放在顶部大号,因此在处理时,所有后续重写规则都不应被测试。
我当前的代码是这样的:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
但这会导致无限重定向到 HTTPS 版本。以下是 FireFox Live HTTP 标头:
获取/HTTP/1.1
主持人:例子.net
用户代理:Mozilla/5.0(Windows NT 10.0;WOW64;rv:51.0)Gecko/20100101 Firefox/51.0
接受:文本/html,应用程序/xhtml+xml,应用程序/xml;q=0.9,/;q=0.8
接受语言:da,en-US;q=0.7,en;q=0.3
接受编码:gzip、deflate、br
不要被:1
联系:活着
升级不安全请求:1HTTP/2.0 301 已永久移动
日期:2017 年 2 月 15 日星期三 15:20:35 GMT
内容类型:文本/html;字符集=iso-8859-1
设置Cookie:__cfduid=d07edac1644bccce1642d2c845767f9951487172035;到期时间=2018 年 2 月 15 日星期四 15:20:35 GMT;路径=/;域=.example.net;HttpOnly
地点: https://example.net/
服务器:cloudflare-nginx
cf-射线:3319bea4dd2f3cfb-CPH
X-Firefox-Spdy:氢键
POST / HTTP/1.1
主持人:ocsp.digicert.com
用户代理:Mozilla/5.0(Windows NT 10.0;WOW64;rv:51.0)Gecko/20100101 Firefox/51.0
接受:文本/html,应用程序/xhtml+xml,应用程序/xml;q=0.9,/;q=0.8
接受语言:da,en-US;q=0.7,en;q=0.3
接受编码:gzip,压缩,压缩
内容长度:83
内容类型:应用程序/ocsp 请求
不要被:1
联系:保持活动 0Q0O0M0K0I0 +HTTP/1.1 200 正常
接受范围:字节
缓存控制:公开,最大年龄=172800
内容类型:应用程序/ocsp 响应
日期:2017 年 2 月 15 日星期三 15:20:35 GMT
标签:“58a44f61-1d7”
有效期:2017 年 2 月 22 日星期三 03:20:35 GMT
上一次更改:2017 年 2 月 15 日星期三 12:53:53 GMT
服务器:ECS(arn/459D)
X-缓存:打
内容长度:471
获取/HTTP/1.1
主持人:例子.net
用户代理:Mozilla/5.0(Windows NT 10.0;WOW64;rv:51.0)Gecko/20100101 Firefox/51.0
接受:文本/html,应用程序/xhtml+xml,应用程序/xml;q=0.9,/;q=0.8
接受语言:da,en-US;q=0.7,en;q=0.3
接受编码:gzip、deflate、br
曲奇饼:__cfduid=d07edac1644bccce1642d2c845767f9951487172035
不要被:1
联系:活着
升级不安全请求:1HTTP/2.0 301 已永久移动
日期:2017 年 2 月 15 日星期三 15:20:35 GMT
内容类型:文本/html;字符集=iso-8859-1
地点: https://example.net/
服务器:cloudflare-nginx
cf-射线:3319bea7ddfb3cfb-CPH
X-Firefox-Spdy:氢键
获取/HTTP/1.1
主持人:例子.net
用户代理:Mozilla/5.0(Windows NT 10.0;WOW64;rv:51.0)Gecko/20100101 Firefox/51.0
接受:文本/html,应用程序/xhtml+xml,应用程序/xml;q=0.9,/;q=0.8
接受语言:da,en-US;q=0.7,en;q=0.3
接受编码:gzip、deflate、br
曲奇饼:__cfduid=d07edac1644bccce1642d2c845767f9951487172035
不要被:1
联系:活着
升级不安全请求:1HTTP/2.0 301 已永久移动
日期:2017 年 2 月 15 日星期三 15:20:36 GMT
内容类型:文本/html;字符集=iso-8859-1
地点: https://example.net/
服务器:cloudflare-nginx
cf-射线:3319beaaae7e3cfb-CPH
X-Firefox-Spdy:氢键
我见过其他类似的问题,但大多数建议的解决方案都是我目前使用的解决方案的变体,而且我已经尝试过它们(但请随意推荐对您有用的方法,我会尝试)。
答案1
Cloudflare 灵活 SSL:您的访问者和 CloudFlare 之间的安全连接,但CloudFlare 和您的 Web 服务器之间没有安全连接。您的 Web 服务器上不需要有 SSL 证书,但您的访问者仍然会看到该网站已启用 HTTPS。来源
因为您从服务器重定向到 HTTPS,而不是使用 Cloudflare 页面规则,所以即使客户端的 HTTPS 请求仍将始终触发重定向规则。
1. Client ---> HTTP ----> Cloudflare CDN ----> HTTP ----> Your server
|
<------- Response: Redirect to HTTPS <-
2. Client ---> HTTPS ----> Cloudflare CDN ----> HTTP ----> Your server
|
<------- Response: Redirect to HTTPS <-
3. Client ---> HTTPS ----> Cloudflare CDN ----> HTTP ----> Your server
|
<------- Response: Redirect to HTTPS <-
Cloudflare 不会与您的网络服务器通信 HTTPS,这会造成无限重定向循环。
要解决这个问题,您需要从 .htaccess 文件中删除重定向,并设置 Cloudflare 页面规则。
答案2
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]