使用 cloudflare 后网站陷入重定向循环

使用 cloudflare 后网站陷入重定向循环

我的网站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。

相关内容