web-dev-qa-db-ja.com

htaccessコードによるリダイレクトが多すぎる

TL; DR:次のコード行は何をしますか? URLから末尾のスラッシュを削除しますか?

    RewriteRule ^(.*)/$ http://%{HTTP_Host}/$1 [R=301,L]

Htaccessファイルがどのように機能するかについてほとんど知識のないDrupalサイトを継承しました。

フォルダがあります。ドキュメントルートに「culture」と呼びましょう。 cultureフォルダーには、index.htmlファイルがあります。これがdocroot/culture/index.htmlです。

ブラウザでwww.mysitename.com/cultureにアクセスしようとすると、無限のリダイレクトが発生します。オンラインリダイレクトチェッカーを使用した後、次のことが発生していることがわかりました。

http://www.mysitename.com/culture/ 301永久に移動 http://www.mysitename.com/culture 301永久に移動...

末尾のスラッシュ(ここの実際のモンスター)は、19回前後に追加および削除されます。これは、エラーの具体的な内容です。

リダイレクトが多すぎます。リダイレクトの数を減らすようにしてください。実際には、19個のリダイレクトを使用します。理想的には、リダイレクトチェーンで3つを超えるリダイレクトを使用しないでください。 3つ以上のリダイレクトはサーバーに不必要な負荷をかけ、速度を低下させ、ユーザーエクスペリエンスが低下します。

残念ながら、問題は次のコード行であることがわかったと思います。

RewriteRule ^(.*)/$ http://%{HTTP_Host}/$1 [R=301,L]

このコード行をコメントすると、リダイレクトは発生しなくなります。ただし、htaccessのコメントでは、コメントアウトしたこの行は、ページの末尾のスラッシュを削除するために使用されると記載されていますが、末尾のスラッシュは削除されずに削除されています。

このコード行が何をするかについての考えはありますか?

4
SuperTony

RewriteRule ^(.*)/$ http://%{HTTP_Host}/$1 [R=301,L]

はい、その行はURLから末尾のスラッシュを削除します。ただし、mod_dirDirectorySlash)がアクティブでファイルシステムディレクトリを要求している場合、書き換えループを防ぐために、その前に条件が必要です。

そして、それはおそらくここの問題です。 「ディレクトリ」がファイルシステム上の実際のディレクトリである/directoryを要求すると、mod_dir(具体的にはDirectorySlashディレクティブ)は、末尾のスラッシュを自動的に追加して、 URL。

したがって、/directory/を要求し、RewriteRuleで末尾のスラッシュを削除し、mod_dirで追加し直します。

ただし、そのディレクトリ内のファイルシステム上のindex.htmlDirectoryIndex)に文字通りアクセスしており、他のルーティングが実行されていない場合、needの最後のスラッシュURL。そのため、ディレクトリのスラッシュが削除されないようにすると便利です。次に例を示します。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ http://%{HTTP_Host}/$1 [R=301,L]

それなしで動作している場合、他の書き換えが行われているか、Drupalがリクエストをルーティングしていると思います。

ただし、末尾のスラッシュは削除されずに削除されます。

たぶんこれは必須ではありません!? .htaccessファイルの残りを見ずに確実に言うことは困難です。

また、キャッシュされた応答が表示されていないことを確認してください。 301(永続)リダイレクトは、ブラウザによって自然にキャッシュされます。

3
MrWhite