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