php_flag display_errors 1
php_value auto_prepend_file init.php
RewriteEngine on
RewriteRule ^$ /id/authenticate [R]
RewriteRule ^login_openid$ /id/login_openid.php [QSA,L]
RewriteRule ^authenticate$ /id/authenticate.php [QSA,L]
RewriteRule ^facebook$ /id/facebook.php [QSA,L]
RewriteRule ^createfromopenid$ /id/createfromopenid.php [QSA,L]
RewriteRule .* - [L,R=403]
これは私の.htaccessファイルです。 serverconfigにはAllowOVerride all
。
URLをリクエストした場合http://mydomain.com/id/authenticate
403エラーが発生します。最後のルールを削除すると機能します。 [L]
フラットはそれ以上のルールの発生を防ぎますか?
編集:
私のhtaccessファイルはサブフォルダー「id」にあるので、ルールは機能します。
_[L]
_ルールは正常に機能します-実際には実際には機能しません。
Apacheが_[L]
_フラグを見つけ、ルールが一致する(書き換えが発生する)と、Apacheは次の反復に移動し、一致を開始しますallルールを再び上から。 _[L]
_フラグは、「この反復で以下のルールを処理しない」を意味します。
はい、Apacheのドキュメントは100%明確ではありません(これは改善できることを意味します)が、十分な情報を提供しています最終的にそれを理解する。
Apacheは、いくつかの状況で書き換えサイクルを停止します。
一致するルールはありません(書き換えは発生しません)。
「今すぐ終了」ルールが一致しました(例:_RewriteRule .* - [L]
_);
書き換えが発生しますが、入力URLと最終URLは同じです(「不適切に」書かれたルールが同じURLを同じURLに書き換えると、2〜3回目の繰り返しで発生します。
たとえば、RewriteRule (.*) /index.php?page=$1 [L]
:
/hello
_ => _/index.php?page=hello
_/index.php
_ => _/index.php?page=index.php
_を書き換えます/index.php
_ => _/index.php?page=index.php
_ ..となります。書き換えの反復制限に達した(デフォルト= 10)-これは、無限の書き換えサイクルを入力した場合です(値は LimitInternalRecursionディレクティブ によって制御されます)。
前述のすべての情報を使用して、現在のルールは期待どおりに機能します。これは、ロジックを変更して最後のルールを削除する必要があることを意味します(この瞬間は親.htaccess ..で処理するか、別の方法で処理する必要があります-すべてはアプリケーションの構築方法に依存します。私はワイルドな推測をしたくありません)。
これをcath all
ルールの前に置きます。
RewriteCond %{ENV:REDIRECT_STATUS} !=200
問題は、[L]フラグが処理されると、次のすべてのRewriteRulesが実際に無視されることですが、ファイルは最初から再び処理され、新しいURLが使用されます。
ファイルがすでにリダイレクトされている場合、この魔法の条件はcatch all
を処理しません。
PS:うまくいかない場合は、条件を少し調整する必要があるかもしれません:200
、!=200
、^.
、^$
。
どうやら、リダイレクトの場合、変数は200
に設定されますが、他のページ(エラーなど)でも何らかの値に設定されます。つまり、必要に応じて、それがis empty
、is not empty
、is 200
またはis not 200
であるかどうかを確認することになります。