web-dev-qa-db-ja.com

mod_rewrite削除末尾のスラッシュがループを引き起こしている

私はmod_rewriteを使用してきれいなURLを作成するサイトを持っています...私が読んだすべての場所で、末尾のスラッシュを削除することはSEOに適しているため、次のルールに従いました。

RewriteRule ^(.+)/$ /$1 [R=301,L]

301リダイレクトはパフォーマンスに影響を与える可能性があると思いますが、それは私の質問ではありません...

問題は、次のように既存のサブディレクトリのindex.phpにアクセスしようとすると、末尾のスラッシュを削除するとループが発生することです。 http://mysite.com/a-real/directory/

私の理解では、mod_rewriteは末尾のスラッシュを削除しようとしますが、この場合は想定されていませんでした。

どうすればこれを修正できますか?私はそれがかなり単純な解決策であると確信していますが、私の知識を超えています。

3
Afonso Gomes

これに対する最も簡単な解決策は、ファイルまたはディレクトリが存在する場合にリダイレクトしないように.htaccessに指示することです。

これを防ぐために、条件に次の2行を追加します

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

(シンボリックリンクされたディレクトリ/ファイルを使用する場合は、-lを追加することもできます)

また、あなたが提案するように、301をドロップすると、完全なhtaccessは次のようになります。

Options +FollowSymLinks
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.+)/$ /$1 [L] 
2
Robbie

mod_dir のドキュメントを参照する必要があります。

サーバーがURLhttp://servername/foo/dirnameの要求を受信すると、「末尾のスラッシュ」リダイレクトが発行されます。ここで、dirnameはディレクトリです。ディレクトリには末尾のスラッシュが必要なため、mod_dirはhttp://servername/foo/dirname/へのリダイレクトを発行します。

このモジュールは、削除した後などにスラッシュを再度追加している可能性があります。 DirectorySlash ディレクティブを使用してその動作を無効にできます。

3
Jack