1

ルールがあります:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+) dir/index.php?$1 [L]
RewriteRule dir/index\.php.* - [F]

最後のルールが処理され、すべてのリクエストに対して Forbidden が返されるのはなぜですか?

ファイルまたはディレクトリが見つからない場合、次のルールが処理されないようにする必要があります。

次の例も私にとってはうまくいきません:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .? - [S=1]
RewriteRule dir/index\.php.* - [F]
RewriteRule (.+) dir/index.php?$1

すべてのリクエストに対して Forbidden を返します。

4

2 に答える 2

2

最後のルールが処理され、すべてのリクエストに対して Forbidden が返されるのはなぜですか?

URLfoobarが要求された場合:

  • 2 つの条件 (2 行目、3 行目) が一致する
  • パターンが一致すると、結果の URL は次のようになりますdir/index.php?foobar(4 行目)
  • フラグは書き換えを停止させます -- 書き換えられた URL が変更されたため、Apache が書き換えられた URL に再度アクセスするの[L]を止めません (以下を参照)。

dir/index.php入力 URL として:

  • ファイルが存在するため、条件が一致しません (2 行目)
  • 5行目にジャンプ
  • パターンが一致するため、Forbidden エラー

ディレクトリまたはファイル名が変更されると、Apache はさまざまな構成セクション (Directoryおよび などFiles) と.htaccess「書き換えられた」パスのファイルを再評価する必要があります。[L]これが、前の反復がフラグによって終了された場合でも、Apache が別の反復を実行する可能性がある理由です。

最後の文字列は、UFL ハンドラへの直接アクセスを制限することを想定しています。直接アクセスとは、次のようなリンクからファイルをリクエストすることを意味します: domain.com/dir/index.php

5行目の前に別の条件を追加するとうまくいくと思います:

RewriteCond %{THE_REQUEST} dir/index\.php\x20HTTP/\d\.\d$
RewriteRule . - [F]

THE_REQUESTサーバー変数には、書き換えを適用せずにブラウザから送信されたリクエストが含まれます。これは、ブラウザーによって最初に要求されたページを検出するのに役立ちます。

リクエスト

ブラウザからサーバーに送信される完全な HTTP 要求行 (例: "GET /index.html HTTP/1.1")。これには、ブラウザから送信された追加のヘッダーは含まれません。以下の他のほとんどの変数とは異なり、この値はエスケープ解除 (デコード) されていません。

于 2012-12-26T10:59:58.117 に答える
0

「次のルール」の意味がよくわかりません。

ただし、存在しないファイルが要求されたときにいくつかのルールを実行したくない場合は、次の構造を使用すると役立つ場合があります。(次のコードはApache RewriteRule Flags Pageからコピーしたものです)

# 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

また、リダイレクトに [L] の代わりに [R] を使用すると、すべてのリクエストに対して Forbidden が返されるという問題を解決できる場合があります。

于 2012-12-26T10:40:43.767 に答える