9

[L] フラグがそれ以上の RewriteRules の処理を​​停止することになっていることは理解していますが、当然のことながらすべての RewriteRule に [L] を追加しているようです。これは、コード スニペットに見られるほぼすべてのルールの一部であり、オンラインの例。

[L] フラグを使用する場合と使用しない場合についてはよくわかりません。これまでに作成したすべての RewriteRules は [L] フラグの有無にかかわらず機能するように思われるからです。

[L] を必要とするルールと [L] を必要としないルールの例を誰か提供できますか?

4

1 に答える 1

12

私の頭の上から、あなたが使いたくない時L

  • Nフラグを使用して書き換えをループする必要がある場合

    # Replace all instances of "aaa" with "zzz"
    RewriteRule ^(.*)aaa(.*)$ /$1zzz$2 [N]
    
  • Cフラグを使用して一連の書き換えを論理的に連鎖させる場合

    # replace "old" with "new" but only if the first rule got applied
    RewriteRule ^special/(.*)$ /chained/$1 [C]
    RewriteRule ^(.*)/old/(.*)$ /$1/new/$2 [L]
    
  • フラグを使用していくつかのルールをスキップする必要がある場合S(実際の例が思いつかないため、Apache ドキュメントから取得)

    # Is the request for a non-existent file?
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # If so, skip these two RewriteRules
    RewriteRule .? - [S=2]
    
    RewriteRule (.*\.gif) images.php?$1
    RewriteRule (.*\.html) docs.php?$1
    
  • リダイレクトしたいが、Rフラグを使用してリダイレクトの前に他のルールで URI を処理する必要がある場合

    # If host is wrong, redirect
    RewriteCond %{HTTP_HOST} bad.host.com
    RewriteRule ^stuff/(.*)$ http://good.host.com/$1 [R=301]
    
    # but not until we apply a few more rules
    RewriteRule ^(.*)/bad_file.php$ /$1/good_file.php [L]
    

一方、Lフラグを使用する必要がない場合もありますが、そのルールが適用されたときに書き換えが確実に停止するようにします。さまざまなルールのセットが互いに干渉するのを防ぐため、ルールの作成が容易になります。そのため、すべてのルールの最後に無害にフラグを含めることは、通常、安全側のLことです。なぜなら、99% のその時、あなたは本当にそこで止めたいだけです。

のみが現在の書き換えの繰り返しLを停止することに注意してください。書き換えエンジンは、エンジンに入る URI が出力される URI とまったく同じになるまでループします (クエリ文字列は URI の一部ではありません)。

于 2012-08-02T12:42:04.713 に答える