マージの順序はかなり複雑で、例外によって簡単に見つけられます。Apachedocは「セクションのマージ方法」です
そのドキュメントによると、セクションのマージの順序は、構成ファイルで検出された順序で各一致タイプのすべての一致エントリを処理し、次のタイプに移動することで行われます(<Directoryを除く>、パスの特異性の順に処理されます)。
タイプの順序はDirectory、DirectoryMatch、Files、そして最後に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内部的なリクエストの場合、を介してファイルシステム内の場所にAlias、ScriptAliasまたは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に勝ちます。