使用 .htaccess 将 http 重定向到 https 失败

使用 .htaccess 将 http 重定向到 https 失败

我有一个使用 CloudFlare 灵活 SLL 的网站,托管在 HostGator 上。

我想重定向全部HTTP 请求到相应的 HTTPS URL。没有例外。我打算将规则放在顶部大号,因此在处理时,所有后续重写规则都不应被测试。

我当前的代码是这样的:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

但这会导致无限重定向到 HTTPS 版本。以下是 FireFox Live HTTP 标头:

https://example.net/

获取/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
联系:活着
升级不安全请求:1

HTTP/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:氢键


http://ocsp.digicert.com/

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


https://example.net/

获取/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
联系:活着
升级不安全请求:1

HTTP/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:氢键


https://example.net/

获取/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
联系:活着
升级不安全请求:1

HTTP/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]

部分摘自: https://stackoverflow.com/a/26623196/2774776

相关内容