この .htaccess 書き換えコードが正しくリダイレクトされないのはなぜですか?
エンドレス リダイレクト ループに陥ります。最後の RewriteRule で L の代わりに END を使用すると、意図したとおりに機能します。なぜこのように動作するのですか?それを修正する他の方法はありますか?
RewriteEngine on
#remove tailing slashes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/+$ /$1 [R,L]
#external redirect: /page.php to /page
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)\.php$ /$1 [R,L]
#internal redirect: page to page.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*?)$ $1\.php [L]
私のApacheのバージョンは2.4.43です
解決:
実際に何が起こったのか、今なら理解できると思います。Mod_rewrite は 1 つのバージョンの URI でのみ機能し、変更は R フラグを使用した場合にのみブラウザーで表示されます。それと@anubhavaの回答が原因で、無限のリダイレクトループが発生しました。つまり、同じバージョンの URI では実際には動作しないと思いました。RewriteRule ^(.*)\.php$ /$1 [R,L]
RewriteRule ^(.*?)$ $1\.php [L]
R フラグの説明:https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_r
回答
フラグL
とEND
動作が異なります。L
flag は、書き換えループを再度実行し ( continue
while ループのように動作する)、END
ループがループを終了する (whileループのように動作する) ことを意味break
します。
END
flag は Apache 2.4 で導入され、現在観察されているように、書き換えのループを防ぐために使用されます。
使用するL
と、最後のルール.php
がリクエスト uri の最後に追加され、書き換えループが再度実行されると、#external redirect
ルールがリクエスト uri から削除され、.php
最後のルールがリクエスト uri の最後に追加.php
されます。このループが続き、無限ループが発生します。これを防ぐためEND
に、最後のルールでフラグを使用して、現在のリクエストの mod_rewrite 実行を終了し、ループ動作を防ぐことができます。
チェック: mod_rewrite ルールセット処理