3

短いテスト例で、order deny,allowこれまでに読んだ内容に対してステートメントがどのように反応するかを理解しようとしています。

テスト用に次のサイト構造があります。

/index.htm
/.htaccess (1)
/subfolder/index.htm
/subfolder/.htaccess (2)

.htaccess (1)

order deny,allow  
allow from all

サブフォルダー/.htaccess (2)

order deny,allow  
deny from all

2 つの .htaccess ファイルで allow,deny / deny,allow (および 4 つの可能なすべての組み合わせ) の順序に関係なく、subfolder/index.htm へのアクセスは許可されません。

私が理解している限り、 rootallow from allが subfolder で勝つ組み合わせが少なくとも 1 つdeny from allあるため、その単純な例でこれを実行できない理由がわかりません。

理由と何が起こっているのか説明できますか?

4

2 に答える 2

6

命令指令

規則order deny,allowおよびは、およびディレクティブが処理されるorder allow,deny順序を定義します。すべての許可ルールと拒否ルールが処理され、最終的な関連ルールが以前のルールを上書きします。確認については、mod_authz_host モジュールのドキュメントのOrder Directiveセクションを参照してください。deny fromallow from

最初の一致のみが使用される一般的なファイアウォールとは異なり、すべての許可および拒否ディレクティブが処理されることに注意してください。最後の一致が有効です (典型的なファイアウォールとは異なります)。さらに、構成ファイルに表示される行の順序は重要ではありません。すべての許可行は 1 つのグループとして処理され、すべての拒否行は別のグループと見なされ、デフォルト状態はそれ自体で考慮されます。

たとえば、許可ルールの前に拒否ルールを処理すると、許可された IP アドレスのホワイトリストを効果的に作成できます。

order deny,allow
deny from all
allow from 127.0.0.1

逆に、次の例では、拒否された IP アドレスのブラックリストに対して、拒否ルールの前に許可ルールを処理します。

order allow,deny
allow from all
deny from 127.0.0.1


継承

サブディレクトリは、独自のルールを宣言しない限り、親ディレクトリのルールを継承します。サブディレクトリが order ディレクティブまたは allow/deny ディレクティブを使用する場合、親からのルールは継承されません。この動作の確認については、このドキュメントの「構成セクションのマージ」セクションに言及しているバグ 52406を参照してください。

mod_access_compat などのマージ ロジックを実装しないモジュールの場合、後のセクションでの動作は、後のセクションにモジュールからのディレクティブがあるかどうかによって異なります。構成は、変更が行われるまで継承されます。変更が行われた時点で、構成は置き換えられ、マージされません。

簡単なテスト

この動作を確認するために、この簡単なテストを行うこともできます。

次の行を親ディレクトリに配置し.htaccessます。

order deny,allow  
deny from all

子ディレクトリ内の次の行のいずれかまたはすべて.htaccess

order deny,allow  
deny from 0.0.0.0

deny from all親ディレクトリにはディレクティブが含まれ、子ディレクトリにはallow fromディレクティブがありませんが、子ディレクトリが公開されていることがわかります。


結論

ドキュメントと実験に基づいて、親ディレクトリが子ディレクタのディレクティブをオーバーライドすることは、どのような方法でも不可能であるようです。

于 2014-07-14T02:38:53.483 に答える