Frage Wie führt Apache mehrere übereinstimmende Standortabschnitte zusammen?


Ich arbeite an einer grundlegenden Apache-Konfiguration, aber ich verstehe nicht genau, wie Apache anders zusammenführt <Location> Abschnitte, wenn mehrere von ihnen mit einer URL für eingehende Anfragen übereinstimmen. Das Apache-Dokumentation in seinem Kapitel "Wie die Abschnitte zusammengeführt werden" ist ein wenig verwirrend, wenn es um die Reihenfolge / Priorität von mehreren übereinstimmenden Abschnitten desselben Typs geht.

Stellen Sie sich beispielsweise die folgende Apache-Konfiguration vor (ignorieren Sie, ob die tatsächlichen Inhalte sinnvoll sind oder nicht, ich interessiere mich nur für die Reihenfolge der einzelnen Regeln / Abschnitte):

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

Jetzt, wenn ein Client eine Anfrage an /sub/foobar, welches ist die endgültige Konfiguration, die auf diese Anfrage angewendet wird?

Ist die angewandte Konfiguration äquivalent zu:

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

Danke für deine Hilfe, ich bin wirklich verwirrend.


27
2018-05-22 14:42


Ursprung




Antworten:


Die Reihenfolge der Zusammenführung ist ziemlich kompliziert und es ist leicht, von Ausnahmen abgefangen zu werden ... Das Apache-Dokument ist "Wie die Abschnitte zusammengeführt werden"

Gemäß dieser Dokumentation wird die Reihenfolge der Zusammenführung von Abschnitten durch Verarbeiten aller übereinstimmenden Einträge für jeden Übereinstimmungstyp in der Reihenfolge, in der sie in den Konfigurationsdateien auftreten, und dann zum nächsten Typ (mit Ausnahme von <Verzeichnis) geändert >, die in der Reihenfolge der Pfadspezifität behandelt wird.

Die Reihenfolge der Typen ist Directory, DirectoryMatch, Files, und schlussendlich Location. Spätere Spiele überschreiben frühere Spiele. (* ProxyPass und Alias ​​werden wieder anders behandelt, siehe Hinweis am Ende)

Und es gibt einige wichtige Ausnahmen zu diesen Regeln, die für die Verwendung von ProxyPass und ProxyPass in einem <Location> -Abschnitt gelten. (siehe unten)

Also von Ihrem obigen Beispiel anfordern http://somehost.com/sub/foobar mit der folgenden Konfiguration;

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

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

Mit den späteren Spielen werden die vorherigen Duplikate eliminiert, was zu;

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

Erläuterung
Spätere Spiele überschreiben frühere Spiele mit Ausnahme von <Directory> Wo Übereinstimmungen in der Reihenfolge verarbeitet werden: Die kürzeste Verzeichniskomponente ist die längste.

Also zum Beispiel
<Directory /var/web/dir>
  wird vorher bearbeitet
<Directory /var/web/dir/subdir>
  Unabhängig davon, in welcher Reihenfolge diese Direktiven in der Konfiguration angegeben wurden, und die spezifischere Übereinstimmung gewinnt.

Irgendein Matching Location Direktive überschreibt immer ein vorher passendes Directory Richtlinie.

Die Grundidee ist, dass für eine Anfrage wie GET /some/http/request.html intern wird es an einem Ort im Dateisystem über einen übersetzt Alias, ScriptAlias oder für einen normalen Speicherort unter der DocumentRoot für den VirtualHost, dass es übereinstimmte.

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

Apache wird dann wiederum alle anwenden Directory Übereinstimmungen in der Reihenfolge der Verzeichnisspezifität aus der Konfiguration und dann wiederum anwenden DirectoryMatch, Files, und schlussendlich Location Übereinstimmungen in der Reihenfolge, in der sie gefunden werden.

So Location überschreibt Files, die überschreibt DirectoryMatchmit passenden Pfaden Directory mit der niedrigsten Priorität. Daher in Ihrem obigen Beispiel eine Anfrage an /sub/foobar würde der ersten 3 Position in der Reihenfolge entsprechen, daher gewinnt der letzte für widersprüchliche Direktiven.

(Sie haben Recht, dass aus den Dokumenten nicht klar ist, wie einige der Randfälle gelöst werden, möglicherweise ist es möglich allow from * Typ Direktiven würde mit dem zugehörigen verbunden werden Order allow,deny, aber das habe ich nicht getestet. Was passiert auch, wenn Sie übereinstimmen Satisfy Any aber du hast vorher ein gesammelt Allow from *...)

Interessanter Hinweis zu ProxyPass und Alias

Nur um nervig zu sein, ProxyPass und Alias scheint in die andere Richtung zu gehen .... ;-) Es trifft im Grunde das erste Spiel, hört dann auf 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.

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

Wie @orev jedoch betont hat. Sie können eine ProxyPass-Direktive in einer Location-Direktive haben, und so wird ein spezifischerer ProxyPass an einem Ort jeden zuvor gefundenen ProxyPass schlagen.


33
2018-05-22 15:58



Vielen Dank für die Warnung vor der Bestellung von ProxyPass-Richtlinien. Er hat mir eine Menge Kopfschmerzen bereitet - Jeremy French
Bezüglich ProxyPass  "in die andere Richtung arbeiten", das ist nur wahr, wenn sie außerhalb von a liegen <Location>. In einem <Location>, die Regeln der Verschmelzung <Location> werden verfolgt, was bedeutet, dass Sie Ihre am wenigsten spezifischen wollen <Location> Direktiven zu kommen Vor die spezifischeren. Dadurch können die spezifischeren die weniger spezifischen Anweisungen überschreiben. Du kannst nur einen haben ProxyPass pro <Location>. - orev