it-swarm.com.de

Wie führt Apache mehrere übereinstimmende Standortabschnitte zusammen?

Ich arbeite an einer grundlegenden Apache-Konfiguration, verstehe aber nicht genau, wie Apache verschiedene <Location> Abschnitte, in denen mehrere mit einer URL für eingehende Anforderungen übereinstimmen. Das Apache-Dokumentation in seinem Kapitel "Wie die Abschnitte zusammengeführt werden" ist etwas verwirrend, wenn es um die Reihenfolge/Priorität mehrerer übereinstimmender Abschnitte desselben Typs geht.

Stellen Sie sich zum Beispiel die folgende Apache-Konfiguration vor (ignorieren Sie, ob der tatsächliche Inhalt sinnvoll ist oder nicht, ich bin nur an der Anwendungsreihenfolge jeder Regel/jedes Abschnitts interessiert):

<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>

Wenn nun ein Client eine Anfrage an /sub/foobar, welche endgültige Konfiguration wird auf diese Anforderung angewendet?

Entspricht die angewendete Konfiguration:

# 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

oder vielleicht

# 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

oder etwas ganz anderes.

Vielen Dank für Ihre Hilfe, ich bin wirklich verwirrend.

38
LordOfThePigs

Die Reihenfolge des Zusammenführens ist ziemlich kompliziert und es ist leicht, von Ausnahmen überrascht zu werden ... Das Apache-Dokument lautet " Wie die Abschnitte zusammengeführt werden "

Gemäß dieser Dokumentation erfolgt die Reihenfolge des Zusammenführens von Abschnitten, indem alle übereinstimmenden Einträge für jeden Übereinstimmungstyp in der Reihenfolge verarbeitet werden, in der sie in den Konfigurationsdateien angetroffen werden, wobei das letzte Spiel gewinnt. (mit Ausnahme von <Verzeichnis>, das in der Reihenfolge der Pfadspezifität behandelt wird).

Die Reihenfolge der Typen ist Directory, DirectoryMatch, Files und schließlich Location. Spätere Übereinstimmungen überschreiben frühere Übereinstimmungen. (* ProxyPass und Alias ​​werden wieder unterschiedlich behandelt, siehe Hinweis am Ende)

Es gibt mehrere wichtige Ausnahmen von diesen Regeln, die für die Verwendung von ProxyPass und ProxyPass in einem Abschnitt <Standort> gelten. (siehe unten)

In Ihrem obigen Beispiel fordern Sie http://somehost.com/sub/foobar mit der folgenden Konfiguration an.

<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>

Es würde die folgenden Richtlinien akkumulieren ....

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

Bei den späteren Übereinstimmungen werden die vorherigen Duplikate entfernt, was zu Folgendem führt:

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

Erklärung
Spätere Übereinstimmungen überschreiben frühere Übereinstimmungen mit Ausnahme von <Directory>, Bei denen Übereinstimmungen in der Reihenfolge verarbeitet werden: kürzeste Verzeichniskomponente bis längste.

So zum Beispiel
<Directory /var/web/dir>
wird vorher bearbeitet
<Directory /var/web/dir/subdir>
unabhängig von der Reihenfolge, in der diese Anweisungen in der Konfiguration angegeben wurden, und die spezifischere Übereinstimmung gewinnt.

Jede übereinstimmende Location - Direktive überschreibt immer eine zuvor übereinstimmende Directory - Direktive.

Die Grundidee ist, dass für eine Anforderung wie GET /some/http/request.html Intern über einen Alias, ScriptAlias oder für einen normalen Dateispeicherort unter DocumentRoot für den übereinstimmenden VirtualHost.

Eine Anfrage hat also die folgenden Eigenschaften, die sie für den Abgleich verwendet:
Location: /some/http/request.html File: /var/www/html/mysite/some/http/request.html Directory: /var/www/html/mysite/some/http

Apache wendet dann nacheinander alle Directory Übereinstimmungen in der Reihenfolge der Verzeichnisspezifität aus der Konfiguration an und wendet dann wiederum DirectoryMatch, Files und schließlich Location stimmt in der Reihenfolge überein, in der sie angetroffen werden.

Location überschreibt also Files, wodurch DirectoryMatch überschrieben wird, wobei Pfade mit Directory mit der niedrigsten Priorität übereinstimmen. Daher würde in Ihrem obigen Beispiel eine Anfrage an /sub/foobar Mit den ersten 3 Positionen in der Reihenfolge übereinstimmen, daher gewinnt die letzte für widersprüchliche Anweisungen.

(Sie haben Recht, dass aus den Dokumenten nicht ersichtlich ist, wie einige der Edge-Fälle gelöst werden. Es ist möglich, dass Anweisungen vom Typ allow from * Mit den zugehörigen Order allow,deny Verbunden sind, aber ich habe es nicht getan. ' t test the. Auch was passiert, wenn Sie mit Satisfy Any übereinstimmen, aber zuvor einen Allow from * gesammelt haben ...)

interessanter Hinweis zu ProxyPass und Alias ​​

Nur um nervig zu sein, scheinen ProxyPass und Alias in die andere Richtung zu funktionieren .... ;-) Es trifft im Grunde das erste Match, stoppt dann und benutzt das!

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.

grundsätzlich müssen Alias- und ProxyPass-Anweisungen angegeben werden, am spezifischsten zuerst.

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

und

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

Allerdings hat @orev darauf hingewiesen. Sie können eine ProxyPass-Direktive in einer Location-Direktive haben, sodass ein spezifischerer ProxyPass in einem Location alle zuvor gefundenen ProxyPass-Dateien übertrifft.

47
Tom H