Apacheは複数の一致するLocationセクションをどのようにマージしますか


35

私はいくつかの基本的なApache設定に取り組んでいますが、<Location>いくつかのセクションが着信リクエストURLと一致するときにApacheがどのように異なるセクションをマージするかを正確に理解していません。「セクションのマージ方法」の章のApacheドキュメントは、同じタイプのいくつかの一致するセクションの順序/優先度に関しては少し混乱しています。

たとえば、次のApache構成を想像してください(実際の内容が意味をなすかどうかは無視して、各ルール/セクションの適用順序にのみ興味があります)。

<Location / >
  ProxyPass http://backend.com/
  Order allow,deny
  Satisfy any
</Location>

<Location /sub/foo>
  Order allow,deny
</Location>

<Location /sub >
  Order deny,allow
  Require valid-user
  Satisfy all
</Location>

<Location /doesnt/match >
  ProxyPass !
</Location>

ここで、クライアントがにリクエストを送信すると、/sub/foobarこのリクエストに適用される最終構成はどれですか?

適用された構成は次と同等ですか?

# All the directives contained in all the matchin Locations in declaration order
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
Order allow,deny
Order deny,allow
Require valid-user
Satisfy all

または多分

# same as above, but with longest matching path last
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
Order deny,allow
Require valid-user
Satisfy all
Order allow,deny

または完全に異なるもの。

あなたの助けをありがとう、私は本当に混乱しています。

回答:


44

マージの順序はかなり複雑で、例外によって簡単に見つけられます。Apachedocは「セクションのマージ方法」です

そのドキュメントによると、セクションのマージの順序は、構成ファイルで検出された順序で各一致タイプのすべての一致エントリを処理し、次のタイプに移動することで行われます(<Directoryを除く>、パスの特異性の順に処理されます)。

タイプの順序はDirectoryDirectoryMatchFiles、そして最後にLocation。後で一致すると、以前の一致が上書きされます。(* ProxyPassとAliasの扱いは再び異なります。最後の注を参照してください)

また、ProxyPassの使用と<Location>セクションでのProxyPassに適用されるこれらのルールには、いくつかの重要な例外があります。(下記参照)

したがって、上記の例では、次の構成でhttp://somehost.com/sub/foobarを要求しています。

<Location / >
  ProxyPass http://backend.com/
  Order allow,deny
  Satisfy any
</Location>

<Location /sub/foo>
  Order allow,deny
</Location>

<Location /sub >
  Order deny,allow
  Require valid-user
  Satisfy all
</Location>

<Location /doesnt/match >
  ProxyPass !
</Location>

次のディレクティブを蓄積します...

  ProxyPass http://backend.com/
  Order allow,deny
  Satisfy any
  Order allow,deny
  Order deny,allow
  Require valid-user
  Satisfy all   

後のマッチで以前の重複を排除し、結果として;

  ProxyPass http://backend.com/
  Order deny,allow
  Require valid-user
  Satisfy all   

説明
後の一致は<Directory>、一致が次の順序で処理される場所を除き、以前の一致を上書きします:最短のディレクトリコンポーネントから最長のコンポーネント。

したがって、たとえば、 これらのディレクティブが構成で指定された順序
<Directory /var/web/dir>

<Directory /var/web/dir/subdir>
関係なく、前に処理され、より具体的な一致が優先されます。

一致するLocationディレクティブは、以前に一致したディレクティブを常にオーバーライドしますDirectory

基本的な考え方は、GET /some/http/request.html内部的なリクエストの場合、を介してファイルシステム内の場所にAliasScriptAliasまたはDocumentRoot一致したVirtualHostの下の通常のファイルの場所に変換されるというものです。

そのため、リクエストには、照合に使用する次のプロパティが含まれます。
Location: /some/http/request.html File: /var/www/html/mysite/some/http/request.html Directory: /var/www/html/mysite/some/http

次に、ApacheはDirectory、構成からディレクトリ固有の順序ですべての一致を順番に適用しDirectoryMatch、次に、、、Filesおよび最後にLocation一致した順に適用します。

したがって、LocationオーバーライドFilesはをオーバーライドしDirectoryMatch、パスDirectoryは最低の優先度で一致します。したがって、上記の例では、リクエスト/sub/foobarは最初の3つの場所に順番に一致するため、競合するディレクティブに対して最後の場所が優先されます。

(あなたはどんなことをその可能な、エッジの例いくつかの解決方法ドキュメントから明らかになっていないことを正しいallow from *タイプのディレクティブが関連付けられているに接続されるだろうOrder allow,denyが、私はあなたが一致した場合にも、何が起こることを。テストしていないSatisfy Anyが、あなた以前に収集したAllow from *...)

ProxyPassとAliasに関する興味深いメモ

ただ、迷惑なこと、ProxyPassそしてAlias他の方向に動作しているように見えますが.... ;-)それは基本的に最初の試合を打つ、そして停止し、使用していること!

Ordering ProxyPass Directives

The configured ProxyPass and ProxyPassMatch rules are 
checked in the order of configuration. 
The first rule that matches wins. So
usually you should sort conflicting ProxyPass rules starting with the
longest URLs first. Otherwise later rules for longer URLS will be
hidden by any earlier rule which uses a leading substring of the URL.
Note that there is some relation with worker sharing.

For the same reasons exclusions must come before the general 
ProxyPass directives.

したがって、基本的には、AliasおよびProxyPassディレクティブを指定する必要があります。最も具体的なものを最初に指定します。

Alias "/foo/bar" "/srv/www/uncommon/bar"
Alias "/foo"     "/srv/www/common/foo"

そして

ProxyPass "/special-area" "http://special.example.com" smax=5 max=10
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On

しかし、@ orevが指摘したように。LocationディレクティブにProxyPassディレクティブを含めることができるため、Location内のより具体的なProxyPassは、以前に見つかったProxyPassに勝ちます。


3
ProxyPassディレクティブの注文に関する警告にフラグを立ててくれてありがとう。頭痛の種を大幅に節約しました
ジェレミーフランス語

2
ProxyPass 「他の方向で作業する」ことに関して、これは彼らが外にいる場合にのみ当てはまります<Location>。内では<Location>、マージのルールに<Location>従います。つまり、最も具体<Location>性の低いディレクティブをより具体的なディレクティブの前に配置する必要があります。これにより、より具体的なディレクティブが、より具体的でないディレクティブをオーバーライドできます。にProxyPassつき1 つのみ使用でき<Location>ます。
orev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.