17

.htaccess ファイルには次のルールがあります

# to redirect http to https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://www.example.com/$1 [R=301,L]

# to redirect urls with index.php to /
RewriteCond %{THE_REQUEST} ^.*/index.php 
RewriteRule ^(.*)index.php$ /$1 [R=301,L]

# to redirect non www requests to www url
RewriteCond %{HTTP_HOST} !^www\.example\.com 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Web サイトにアクセスしようとすると、リダイレクト ループになります。この問題を修正して適切にリダイレクトするにはどうすればよいですか?

4

6 に答える 6

34

ロードバランサーの背後でApache http-> https rewriteを使用しているときに誰かがリダイレクトループを持っている場合に備えて、これが私のために働いた解決策です.

ロードバランサーが SSL 処理を行うときに、ロードバランサーの背後にある Apache にRewriteCond %{HTTPS} offを使用すると、同じ問題が発生しました。

サイトの https バージョンが Apache ModSSL 経由で構成されていない場合、%{HTTPS} 変数が「オン」に設定されず、無限にリダイレクトされ続けます。

それを修正する最も簡単な解決策は、すべての https トラフィックを別の Apache VirtualHost (SSL がロード バランサーによって処理される場合) のターゲットにすることです。これは、メインのもののコピーですが、別のポート (81 としましょう) を持っています。.htaccess では、ポート 81 以外のすべてに対して mod_rewrite を実行します。

ReWriteCond %{SERVER_PORT} !^81$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]

これを行う 2 つ目の方法は、X-Forwarded-Proto ヘッダーをロード バランサーから Apache に送信し、それを書き換え状態で使用することです。

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
于 2013-11-01T07:45:57.660 に答える
14

.htaccess ファイルを使用して http から https に移動しようとすると、リダイレクト ループに苦しむ多くの人を見てきました。そして、この問題を解決する方法には、さまざまな答えがあります。一部の人々は次のように言います。

ReWriteCond %{SERVER_PORT} 80
OR
RewriteCond %{HTTPS} off
OR
RewriteCond %{HTTPS} !on
OR (as above)
RewriteCond %{HTTP:X-Forwarded-Proto} !https
OR EVEN
RewriteCond %{HTTP:X-Forwarded-SSL} =off

しかし、これらのどれも私にとってはうまくいきませんでした。私は最終的に、そこにあるさまざまなサーバーがさまざまな方法で構成されており、それらはすべて異なるサーバー変数を提供しているという根本的な真実を発見しました。

上記のいずれもうまくいかない場合、秘訣は PHP を使用して、http ページにアクセスしたときに特定のサーバーが送信する環境変数と、https ページにアクセスしたときに送信する環境変数を見つけることです。次に、その変数を使用してリダイレクトを行うことができます。次のコードを使用して、サーバー上に PHP ファイル (showphpvars.php など) を作成するだけです。

<?php phpinfo() ?>

その後、ブラウザで表示します。_SERVER["HTTP_HOST" (etc)] を含む変数のセクションを見つけて、http と https で変化するセクションを探してください。私のものは、httpsを使用する場合は1に設定され、httpを使用する場合はまったく設定されないSSLという変数であることが判明しました。

その変数を使用して、PHP で https にリダイレクトしました。これは、htaccess を使用するよりもはるかに優れていますが、引き続き使用したい場合は、htaccess を使用して _SERVER 変数にもアクセスできると思います。PHP が追加する _SERVER[""] ビットなしで、引用符内の名前を使用するだけです。

于 2015-03-14T17:08:24.803 に答える
7

参考までに、ホスティングプロバイダーによって異なります。Konstantin が別の回答で述べているように、ロード バランサーを使用している可能性があります。

私の場合(Infomaniak)、上記の何も実際には機能せず、無限のリダイレクトループが発生しました。

これを行う正しい方法は、実際にはサポート サイトで説明されています

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://your-domain.com/$1 [R=301,L]

したがって、常にホスティングプロバイダーに確認してください。うまくいけば、彼らはこれを行う方法を説明する記事を持っています. それ以外の場合は、サポートに問い合わせてください。

于 2017-11-30T09:32:11.690 に答える
0
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{
于 2016-06-20T16:31:28.340 に答える