htaccess リダイレクト ループは 2 つのサーバーのうち 1 つでのみ発生します

htaccess リダイレクト ループは 2 つのサーバーのうち 1 つでのみ発生します

2 台のサーバーに Web アプリをインストールしています。 1 台のサーバーでホームページにアクセスすると、ブラウザーに「エラー コード: ERR_TOO_MANY_REDIRECTS」というエラーが表示されますが、もう 1 台のサーバーではすべて正常に動作します。 両方のサーバーで Apache 2.4 が動作しています。

Apache 設定のどの部分がリダイレクト ルールに関連していますか? 2 つの設定の違いはどこで確認すればよいですか?

念のため、htaccess ファイルを次に示します。

<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On

  # Get rid of index.php
  RewriteCond %{REQUEST_URI} /index\.php
  RewriteRule (.*) index.php?rewrite=2 [L,QSA]

  # Rewrite all directory-looking urls
  RewriteCond %{REQUEST_URI} /index.php/$
  RewriteRule (.*) index.php?rewrite=1 [L,QSA]

  # Try to route missing files
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} public\/ [OR]
  RewriteCond %{REQUEST_FILENAME} \.(jpg|gif|png|ico|flv|htm|html|php|css|js)$
  RewriteRule . - [L]

  # If the file doesn't exist, rewrite to index
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?rewrite=1 [L,QSA]

</IfModule>

# sends requests /index.php/path/to/module/ to "index.php"
# AcceptPathInfo On

# @todo This may not be effective in some cases
FileETag Size

<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
</IfModule>

答え1

このような異なる動作は設定の違いに起因することがよくあるので、スクリプトを書きました(httpd-ダンプ設定) を実行して httpd.conf をフラット化し、比較してクラスタノード間または環境間 (SSH 経由であっても) の違いを監査できるようにしました。

ただし、.htaccess ファイルはチェックされませんが、見落とされがちな .htaccess ファイルを見つけるのに役立ちます。

find $(httpd-dump-config | grep -i DocumentRoot | awk '{print $2}') -type f -name '.htaccess' -print

下記のように ssh&diff で上記を試すことはお勧めしません (エスケープすると失敗するため)

2 台のマシンの .htaccess 以外の構成を比較します。

diff <(httpd-dump-config) \
     <(ssh webserverB.dom httpd-dump-config)

コードからリダイレクトが発行される可能性もあります (PHP が Location ヘッダーを送信するなど。これは、私が見た多くの PHP でよく見られる、散らかっていたり隠れていたりするものです)。

答え2

すべてのブラウザでこのエラーが発生していますか?

この問題に遭遇するたびに、それは常に特定のブラウザの小さな不具合か、奇妙な URL の結果です。


書き換えルールは通常これです

RewriteEngine on
RewriteCond   /your/docroot/%{REQUEST_FILENAME} !-f
RewriteRule   ^(.+)                             http://webserverB.dom/$**1

「ここでの問題は、これが DocumentRoot 内のページでのみ機能することです。条件をさらに追加することもできますが (たとえば、ホームディレクトリなども処理するため)、より優れた方法があります:」

RewriteEngine on
RewriteCond   %{REQUEST_URI} !-U
RewriteRule   ^(.+)          http://webserverB.dom/$1**

「これは、mod_rewrite の URL 先読み機能を使用します。その結果、これはすべてのタイプの URL で機能し、安全な方法です。ただし、すべてのリクエストに対して 1 つ以上の内部サブリクエストがあるため、Web サーバーのパフォーマンスに影響します。したがって、Web サーバーが強力な CPU で動作している場合は、これを使用してください。遅いマシンの場合は、最初の方法を使用するか、ErrorDocument CGI スクリプトを使用することをお勧めします。」

また、以下もご覧ください拡張リダイレクト

http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

関連情報