L'ordre de fusion est assez compliqué, et il est facile de se faire surprendre par des exceptions... La documentation apache est "Comment les sections sont fusionnées"
Selon cette documentation, l'ordre de fusion des sections est effectué en traitant toutes les entrées correspondantes pour chaque type de correspondance dans l'ordre où elles sont rencontrées dans les fichiers de configuration, le dernier match gagnant. (à l'exception de , qui est traité dans l'ordre de la spécificité du chemin).
L'ordre des types est Directory
, DirectoryMatch
, Files
, et enfin Location
. Les matchs ultérieurs écrasent les matchs précédents. (*ProxyPass et Alias sont traités différemment, voir la note en bas)
Et il y a plusieurs exceptions importantes à ces règles qui s'appliquent à l'utilisation de ProxyPass et de ProxyPass dans une section . (voir ci-dessous)
Ainsi, à partir de votre exemple ci-dessus en demandant http://somehost.com/sub/foobar avec la configuration suivante;
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
Order allow,deny
Order deny,allow
Require valid-user
Satisfy all
ProxyPass !
Cela accumulerait les directives suivantes ....
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
Order allow,deny
Order deny,allow
Require valid-user
Satisfy all
Les matchs ultérieurs éliminant les doublons précédents, aboutissant à;
ProxyPass http://backend.com/
Order deny,allow
Require valid-user
Satisfy all
Explication
Les matchs ultérieurs écrasent les matchs précédents à l'exception de où les matchs sont traités dans l'ordre : composant de répertoire le plus court au plus long.
Par exemple,
sera traité avant
quelle que soit l'ordre dans lequel ces directives ont été spécifiées dans la configuration, et le match le plus spécifique l'emporte.
Toute directive Location
correspondante remplacera toujours une directive Directory
correspondante précédente.
L'idée de base est que pour une requête comme GET /some/http/request.html
elle sera traduite en interne en un emplacement dans le système de fichiers via un Alias
, ScriptAlias
ou pour un emplacement de fichier normal sous le DocumentRoot
pour le VirtualHost auquel elle correspond.
Ainsi une requête aura les propriétés suivantes qu'elle utilise pour correspondre:
Location: /some/http/request.html Fichier : /var/www/html/mysite/some/http/request.html Répertoire : /var/www/html/mysite/some/http
Apache appliquera ensuite tous les matchs de Directory
, dans l'ordre de spécificité du répertoire, à partir de la configuration, puis appliquera successivement les matchs de DirectoryMatch
, Files
, et enfin les matchs de Location
dans l'ordre où ils sont rencontrés.
Ainsi Location
remplace Files
, qui remplace DirectoryMatch
, avec les chemins correspondants à Directory
ayant la plus basse priorité. Ainsi, dans votre exemple ci-dessus, une requête à /sub/foobar
correspondrait aux 3 premiers emplacements dans l'ordre, donc le dernier l'emporte pour les directives en conflit.
(Vous avez raison de dire que ce n'est pas clair dans la documentation comment certains des cas particuliers sont résolus, il est possible que tout type de directive allow from *
soit associé à la directive Order allow,deny
, mais je n'ai pas testé cela. Et que se passe-t-il si vous correspondance à Satisfy Any
mais que vous avez déjà collecté un Allow from *
...)
note intéressante à propos de ProxyPass et Alias
Juste pour être ennuyeux, ProxyPass
et Alias
semblent fonctionner dans l'autre sens.... ;-) Il frappe essentiellement le premier match, puis s'arrête et l'utilise!
Ordre des directives ProxyPass
Les règles ProxyPass et ProxyPassMatch configurées sont
vérifiées dans l'ordre de configuration.
La première règle qui correspond l'emporte. Donc
en général, vous devriez trier les règles ProxyPass conflictuelles en commençant par les
URL les plus longues en premier. Sinon les règles ultérieures pour les URL plus longues
seront cachées par toute règle antérieure qui utilise une sous-chaîne de l'URL.
Notez qu'il y a une relation avec le partage des travailleurs.
Pour les mêmes raisons, les exclusions doivent venir avant les règles ProxyPass générales.
donc en gros, les directives Alias et ProxyPass doivent être spécifiées, la plus spécifique en premier;
Alias "/foo/bar" "/srv/www/uncommon/bar"
Alias "/foo" "/srv/www/common/foo"
et
ProxyPass "/special-area" "http://special.example.com" smax=5 max=10
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On
Cependant, comme l'a souligné @orev. Vous pouvez avoir une directive ProxyPass dans une directive Location, donc un ProxyPass plus spécifique dans une Location l'emportera sur tout ProxyPass trouvé précédemment.