web-dev-qa-db-ja.com

.htaccess mod書き換えサブディレクトリリダイレクトループ

個々の.htaccessでサブディレクトリをセットアップしようとしています。拡張子のない.htmlファイルをURLにリダイレクトし、末尾のスラッシュを追加して、すべての非スラッシュURLをリダイレクトします。

これが私の.htaccessです:

<IfModule mod_rewrite.c>

Options -MultiViews -Indexes
RewriteEngine On
RewriteBase /test

# redirect urls without trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !index.html
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule (.*)$ %{REQUEST_URI}/ [L,R=301]

# remove .html extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*)/$ $1.html

</IfModule>

それは機能しますが、相対パスは最大リダイレクト制限まで繰り返し.htmlを追加します。影響を受けるサンプルパス:/css/test.cssおよびcss/test.css。 /sub/css/test.cssは正常に動作します。

RewriteCond %{REQUEST_FILENAME}!-fをRewriteCond %{REQUEST_FILENAME}.html !-fまたは同様の順列に変更しても、まったく効果がないようです。

.htmlファイルのみをリダイレクトしたい。ここで何が欠けていますか?

2
DominicM

この問題は主に、ルールが.htmlファイルに固有ではないという事実によるものでした。これは、.cssファイルを含むすべてのファイルがリダイレクトされることを意味していました。

動作する.htaccessファイルは次のとおりです。

<IfModule mod_rewrite.c>
Options -MultiViews -Indexes
RewriteEngine On
RewriteBase /sub

# redirect urls without trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !index.html
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule (.*)$ $1/ [L,R=301]

# remap url to a .html file
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*)/$ $1.html [L]

</IfModule>

Htmlファイル内の相対パスは、/ sub/test.cssなどの絶対パスに変更する必要がありました

存在しないURL(一致するファイルはありません)は依然としてリダイレクトループになりますが、これは理想的ではありません。

0
DominicM