この .htaccess 書き換えコードが正しくリダイレ​​クトされないのはなぜですか?

May 17 2020

エンドレス リダイレクト ループに陥ります。最後の 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

回答

1 anubhava May 18 2020 at 00:02

フラグLEND動作が異なります。Lflag は、書き換えループを再度実行し ( continuewhile ループのように動作する)、ENDループがループを終了する (whileループのように動作する) ことを意味breakします。

ENDflag は Apache 2.4 で導入され、現在観察されているように、書き換えのループを防ぐために使用されます。

使用するLと、最後のルール.phpがリクエスト uri の最後に追加され、書き換えループが再度実行されると、#external redirectルールがリクエスト uri から削除され、.php最後のルールがリクエスト uri の最後に追加.phpされます。このループが続き、無限ループが発生します。これを防ぐためENDに、最後のルールでフラグを使用して、現在のリクエストの mod_rewrite 実行を終了し、ループ動作を防ぐことができます。

チェック: mod_rewrite ルールセット処理