51 votes

Comment Apache fusionne-t-il plusieurs sections Location correspondantes

Je travaille sur une configuration apache de base, mais je ne comprends pas précisément comment apache fusionne différentes sections lorsque plusieurs d'entre elles correspondent à l'URL d'une requête entrante. La documentation apache dans son chapitre "Comment les sections sont fusionnées" est un peu confuse en ce qui concerne l'ordre/la priorité de plusieurs sections correspondantes du même type.

Par exemple, imaginez la configuration apache suivante (ignorez si le contenu réel a du sens ou non, je m'intéresse uniquement à l'ordre d'application de chaque règle/section) :

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

  Order allow,deny

  Order deny,allow
  Require valid-user
  Satisfy all

  ProxyPass !

Maintenant, si un client fait une requête à /sub/foobar, quelle est la configuration finale qui sera appliquée à cette requête ?

Est-ce que la configuration appliquée est l'équivalent de :

# Toutes les directives contenues dans toutes les Locations correspondantes dans l'ordre de déclaration
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
Order allow,deny
Order deny,allow
Require valid-user
Satisfy all

ou peut-être

# pareil que ci-dessus, mais avec le chemin correspondant le plus long en dernier
ProxyPass http://backend.com/
Order allow,deny
Satisfy any
Order deny,allow
Require valid-user
Satisfy all
Order allow,deny

ou quelque chose de complètement différent.

Merci pour votre aide, je suis vraiment confus.

65voto

Tom Points 10766

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.

0voto

Nobody Points 1

Si vous imbriquez une section (par exemple : ): les sections imbriquées sont fusionnées après les sections non imbriquées du même type. Cela signifie que si vous ajoutez un bloc à une configuration non imbriquée, votre dernière section correspondante change.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X