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>

ウェブサイトはクラウドフレアなしでも正常に動作しますが、クラウドフレアを有効にするとすぐに 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 の Flexible SSL サービスを使用している場合、オリジン Web サーバーはポート 80 で暗号化されていないトラフィックを受信します。

これを解決するには、いくつかのオプションがあります。

  • CloudflareのSSLモードを設定するオリジンがサポートしている場合は、FullまたはFull (Strict)に設定してください。CloudflareのOrigin CAサービスWeb サーバー用の無料の SSL 証明書を取得します。
  • Mod_CloudflareをインストールするApache の場合、これにより、IP を正しく記録したり、SSL 環境変数を修正して Flexible SSL を考慮したりするなど、Cloudflare が透過的に動作するようになります。
  • 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はどのように実装されていますか?SSLを処理するフロントエンドプロキシとしてCloudFlareを使用している場合(無料バージョンが私の知る限りでは、Web サイトは引き続き HTTP (ポート 80) で CloudFlare にコンテンツを提供し、接続は CloudFlare からクライアントへのみ暗号化されます。この場合、上記のリダイレクトは実際に 302 リダイレクト ループになります。(これは通常、301 として実装される必要があります。Redirect 301 ...)

この場合、クライアントが HTTPS 経由でサイト (または CloudFlare) にアクセスしているかどうかを確認するためにチェックできる追加の HTTP リクエスト ヘッダーがいくつかあります。

RewriteEngine on
RewriteCond %{SERVER_NAME} =stage.issufy.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]

ちなみに、これは上記の単一の指示と同じことをしようとしていますRedirect(ただし永久に)。両方ではなく、どちらか一方を使用してください。

できれば、単一のRedirect 301(mod_alias) ディレクティブを使用します。ただし、HTTPS を判別するためにプロキシ HTTP リクエスト ヘッダーをチェックする必要がある場合は、mod_rewrite が必要になります。

関連情報