mod_rewrite:ルールのリストを一度だけ表示

mod_rewriteには1つの問題があり、約1500万個のコーンがおそらくいっぱいです。少なくとも何らかの形でURLが変更されるまで、ルールのリストを何度もスキャンします。



非常に多くの場合、無限のサイクルが発生し(たとえば、拡張子を追加します-正規表現を特に制限しない限り、何度も追加されます)、その上で頭を壊す必要があります。 [L]修飾子に対するすべての期待は無駄です。次の処理の反復をただちに開始するだけです。 そして、無限ループがなくても、速度を余分に繰り返しても追加されません:-)



私が発見したような機能を扱うためのかなりシンプルで普遍的な手段を共有したい:-)





RewriteCond %{ENV:REDIRECT_FINISH} !^$

RewriteRule ^ - [L]



#

RewriteRule ^/?page/([az]+)$ read.php?page=$1 [E=FINISH:1,L,QSA]

RewriteRule ^.*$ 404.php [E=FINISH:1,L]








ここで何が起こっていますか? 最終的なURL変換が完了するとすぐに、FINISH環境変数を設定し、次の反復で、ApacheはプレフィックスREDIRECT_を持つ古い変数環境をコピーし、インストールされたREDIRECT_FINISHを確認してジョブを終了します。 テレマーケット:-)



PS:nginxに組み込まれているrewrite-engineには、この問題は生まれてからありませんが、そうです;-)



更新:彼らはコメントでさらに短く提案し、最初の反復後に無条件に切り捨てました:



# Don't loop.

RewriteCond %{ENV:REDIRECT_STATUS} !^$

RewriteRule .* — [L]







All Articles