我的网站https://stage.issufy.com/,设置 SSL 后,我得到 302 重定向循环。这是 htaccess 文件
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>
以下是 Apache 的 http 配置:
<VirtualHost *:80>
ServerName stage.issufy.com
Redirect / https://stage.issufy.com
DocumentRoot /var/www/html/stage.issufy.com
<Directory "/var/www/html/stage.issufy.com">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =stage.issufy.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</VirtualHost>
SSL 配置如下:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName stage.issufy.com
DocumentRoot /var/www/html/stage.issufy.com
<Directory "/var/www/html/stage.issufy.com">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /etc/letsencrypt/live/stage.issufy.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/stage.issufy.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
网站在没有 cloudfare 的情况下运行良好,但一旦启用 cloudflare,就会出现 302 重定向错误。
这是错误日志
172.68.51.31 - - [17/Jan/2017:18:24:18 +0000] "GET / HTTP/1.1" 302 539 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Dragon/52.15.25.665 Chrome/52.0.2743.82 Safari/537.36"
172.68.51.31 - - [17/Jan/2017:18:24:18 +0000] "GET / HTTP/1.1" 302 538 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Dragon/52.15.25.665 Chrome/52.0.2743.82 Safari/537.36"
172.68.51.31 - - [17/Jan/2017:18:24:18 +0000] "GET / HTTP/1.1" 302 538 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Dragon/52.15.25.665 Chrome/52.0.2743.82 Safari/537.36"
172.68.51.31 - - [17/Jan/2017:18:24:19 +0000] "GET / HTTP/1.1" 302 538 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Dragon/52.15.25.665 Chrome/52.0.2743.82 Safari/537.36"
172.68.51.31 - - [17/Jan/2017:18:24:19 +0000] "GET / HTTP/1.1" 302 539 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Dragon/52.15.25.665 Chrome/52.0.2743.82 Safari/537.36"
172.68.51.31 - - [17/Jan/2017:18:24:19 +0000] "GET / HTTP/1.1" 302 538 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Dragon/52.15.25.665 Chrome/52.0.2743.82 Safari/537.36"
172.68.51.31 - - [17/Jan/2017:18:24:20 +0000] "GET / HTTP/1.1" 302 539 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Dragon/52.15.25.665 Chrome/52.0.2743.82 Safari/537.36"
172.68.51.31 - - [17/Jan/2017:18:24:20 +0000] "GET / HTTP/1.1" 302 539 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Dragon/52.15.25.665 Chrome/52.0.2743.82 Safari/537.36"
答案1
如果您使用 Cloudflare 的灵活 SSL 产品 - 您的原始 Web 服务器将看到端口 80 下未加密的流量。
为了解决这个问题,您有以下几种选择:
- 设置 Cloudflare 的 SSL 模式如果您的源支持,则将其设置为完全或完全(严格)。您甚至可以使用Cloudflare 的 Origin CA 服务为您的网络服务器获取免费的 SSL 证书。
- 安装 Mod_Cloudflare对于 Apache,这将确保 Cloudflare 的运行透明 - 包括正确记录 IP 或更正 SSL 环境变量以考虑灵活的 SSL。
- 设置 Apache 来考虑
X-Forwarded-Proto
(这会揭示用户以什么身份连接到 Cloudflare)。
答案2
似乎 Cloudflare 的 nginx 由于某些重定向规则而感到困惑:
HTTP/1.1 302 Found
Date: Tue, 17 Jan 2017 18:18:09 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Set-Cookie: __cfduid=da71659f540fb5dad0c47d48669012aa61484677089; expires=Wed, 17-Jan-18 18:18:09 GMT; path=/; domain=.issufy.com; HttpOnly
Location: https://stage.issufy.com
Server: cloudflare-nginx
CF-RAY: 322bcedefcc859d2-VIE
您是否尝试过完全禁用 .htaccess 文件,然后逐条重新添加规则以消除那里的问题?
答案3
Redirect / https://stage.issufy.com
这似乎是您配置中唯一的 302(临时)重定向。
CloudFlare SSL 是如何实现的?如果您使用 CloudFlare 作为处理 SSL 的前端代理(自由的版本 AFAIK),那么您的网站仍然通过 HTTP (端口 80) 向 CloudFlare 提供内容,并且连接仅从 CloudFlare 到客户端加密。在这种情况下,上述重定向确实会导致 302 重定向循环。(这通常应实现为 301。即。Redirect 301 ...
)
如果是这种情况,那么您可以检查一些额外的 HTTP 请求标头,以查看客户端是否通过 HTTPS 访问您的网站(或者更确切地说是 CloudFlare)。
RewriteEngine on RewriteCond %{SERVER_NAME} =stage.issufy.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
顺便说一句,这是试图做和上面的单个指令相同的事情Redirect
(尽管永久)。请使用其中一个,不要同时使用两者。
最好使用单个Redirect 301
(mod_alias) 指令。但是,如果您需要检查代理 HTTP 请求标头以确定 HTTPS,那么您将需要 mod_rewrite。