web-dev-qa-db-ja.com

RewriteRule Last [L]フラグが機能しない?

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」にあるので、ルールは機能します。

29
The Surrican

_[L]_ルールは正常に機能します-実際には実際には機能しません

Apacheが_[L]_フラグを見つけ、ルールが一致する(書き換えが発生する)と、Apacheは次の反復に移動し、一致を開始しますallルールを再び上から。 _[L]_フラグは、「この反復で以下のルールを処理しない」を意味します。

はい、Apacheのドキュメントは100%明確ではありません(これは改善できることを意味します)が、十分な情報を提供しています最終的にそれを理解する。


Apacheは、いくつかの状況で書き換えサイクルを停止します。

  1. 一致するルールはありません(書き換えは発生しません)。

  2. 「今すぐ終了」ルールが一致しました(例:_RewriteRule .* - [L]_);

  3. 書き換えが発生しますが、入力URLと最終URLは同じです(「不適切に」書かれたルールが同じURLを同じURLに書き換えると、2〜3回目の繰り返しで発生します。

    たとえば、RewriteRule (.*) /index.php?page=$1 [L]

    • _/hello_ => _/index.php?page=hello_
    • 次の反復で_/index.php_ => _/index.php?page=index.php_を書き換えます
    • 3回目の反復では、これは_/index.php_ => _/index.php?page=index.php_ ..となります。
  4. 書き換えの反復制限に達した(デフォルト= 10)-これは、無限の書き換えサイクルを入力した場合です(値は LimitInternalRecursionディレクティブ によって制御されます)。


前述のすべての情報を使用して、現在のルールは期待どおりに機能します。これは、ロジックを変更して最後のルールを削除する必要があることを意味します(この瞬間は親.htaccess ..で処理するか、別の方法で処理する必要があります-すべてはアプリケーションの構築方法に依存します。私はワイルドな推測をしたくありません)。

75
LazyOne

これをcath allルールの前に置きます。

RewriteCond %{ENV:REDIRECT_STATUS} !=200

問題は、[L]フラグが処理されると、次のすべてのRewriteRulesが実際に無視されることですが、ファイルは最初から再び処理され、新しいURLが使用されます。

ファイルがすでにリダイレクトされている場合、この魔法の条件はcatch allを処理しません。

PS:うまくいかない場合は、条件を少し調整する必要があるかもしれません:200!=200^.^$
どうやら、リダイレクトの場合、変数は200に設定されますが、他のページ(エラーなど)でも何らかの値に設定されます。つまり、必要に応じて、それがis emptyis not emptyis 200またはis not 200であるかどうかを確認することになります。

9
Qwerty