使用 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>

這是 http 的 Apache 設定:

<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 服務為您的 Web 伺服器取得免費的 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。

相關內容