A ordem da mesclagem é bastante complicada e é fácil ser detectada por exceções ... O documento do apache é " Como as seções são mescladas "
De acordo com essa documentação, a ordem de mesclagem das seções é feita processando todas as entradas correspondentes para cada tipo de correspondência na ordem em que são encontradas nos arquivos de configuração e, em seguida, movendo-se para o próximo tipo (com a exceção de <Diretório >, que é tratado em ordem de especificidade do caminho).
A ordem dos tipos é Directory
, DirectoryMatch
, Files
, e, finalmente Location
. As correspondências posteriores substituem as correspondências anteriores. (* ProxyPass e Alias são tratados de forma diferente novamente, veja a nota no final)
E há várias exceções importantes a essas regras que se aplicam ao uso do ProxyPass e ProxyPass em uma seção <Location>. (ver abaixo)
Portanto, a partir do seu exemplo acima, solicite http://somehost.com/sub/foobar com a seguinte configuração;
<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>
Acumularia as seguintes diretrizes ....
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
Order allow,deny
Order deny,allow
Require valid-user
Satisfy all
Com as correspondências posteriores, eliminando as duplicatas anteriores, resultando em;
ProxyPass http://backend.com/
Order deny,allow
Require valid-user
Satisfy all
Explicação
As correspondências posteriores substituem as correspondências anteriores, com exceção de <Directory>
onde as correspondências são processadas na ordem: do componente de diretório mais curto ao mais longo.
Por exemplo,
<Directory /var/web/dir>
serão processados antes,
<Directory /var/web/dir/subdir>
independentemente da ordem em que essas diretivas foram especificadas na configuração e a correspondência mais específica vencer.
Qualquer Location
diretiva correspondente sempre substituirá uma Directory
diretiva correspondente anteriormente .
A idéia básica é que para um pedido como GET /some/http/request.html
internamente ele será traduzido para um local no sistema de arquivos por meio de um Alias
, ScriptAlias
ou para uma localização de arquivo normal sob o DocumentRoot
para o VirtualHost que combinava.
Portanto, uma solicitação terá as seguintes propriedades usadas para correspondência:
Location: /some/http/request.html
File: /var/www/html/mysite/some/http/request.html
Directory: /var/www/html/mysite/some/http
O Apache aplicará, por sua vez, todas as Directory
correspondências, na ordem da especificidade do diretório, a partir da configuração e, por sua vez DirectoryMatch
, aplicará Files
, e finalmente Location
corresponderá na ordem em que elas forem encontradas.
Assim , Location
substitui Files
, que substitui DirectoryMatch
, com caminhos correspondentes Directory
na prioridade mais baixa. Portanto, em seu exemplo acima, uma solicitação para /sub/foobar
corresponder aos 3 primeiros locais em ordem, portanto, o último vence por diretivas conflitantes.
(Você está certo de que não está claro nos documentos como alguns casos extremos são resolvidos, é possível que qualquer allow from *
diretiva de tipo esteja conectada ao associado Order allow,deny
, mas eu não testei isso. Além disso, o que acontece se você corresponder, Satisfy Any
mas você já coletaram um Allow from *
...)
nota interessante sobre ProxyPass e Alias
Só para ser chato, ProxyPass
e Alias
parece funcionar na outra direção .... ;-) Basicamente, atinge a primeira partida, depois para e a usa!
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.
portanto, basicamente, as diretivas Alias e ProxyPass precisam ser especificadas, mais específicas primeiro;
Alias "/foo/bar" "/srv/www/uncommon/bar"
Alias "/foo" "/srv/www/common/foo"
e
ProxyPass "/special-area" "http://special.example.com" smax=5 max=10
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On
No entanto, como @orev apontou. Você pode ter uma diretiva ProxyPass em uma diretiva Location e, portanto, um ProxyPass mais específico em um Location superará qualquer ProxyPass encontrado anteriormente.
ProxyPass
"trabalhar na outra direção" , isso só é verdade se eles estiverem fora de a<Location>
. Dentro de a<Location>
, as regras de mesclagem<Location>
são seguidas, o que significa que você deseja que suas<Location>
diretivas menos específicas venham antes das mais específicas. Isso permite que os mais específicos substituam as diretivas menos específicas. Você pode ter apenas umProxyPass
por<Location>
.