Vorwort
Ich bin ein Neuling in Bezug auf Webserver. Ich richte einen Apache2-Server ein und stöbere gerade in der Dokumentation.
Ich bemerkte , dass die <Directory>
, <Location>
und <Files>
Richtlinien haben jeweils eine entsprechende <*Match>
Richtlinie: <DirectoryMatch>
, <LocationMatch>
und <FilesMatch>
jeweils. Der Unterschied an der Oberfläche ist offensichtlich genug:
<*Match>
Direktiven nehmen einen regulären Ausdruck als Argument- Nicht übereinstimmende Direktiven verwenden eine einfache Zeichenfolge oder einen Glob im Shell-Stil als Argument.
Seltsamerweise kann den Nicht-Match-Direktiven auch ein regulärer Ausdruck als Argument gegeben werden, wenn ein '~' vorangestellt ist. Daher sollten die folgenden zwei Zeilen identisch sein:
# From the Apache2 docs
<Directory ~ "^/www/[0-9]{3}"> ... </Directory>
<DirectoryMatch "^/www/[0-9]{3}"> ... </DirectoryMatch>
Fragen
Ich würde gerne wissen, ob es subtile oder wichtige Unterschiede gibt, die zu beachten sind, dass die core
Dokumente von Apache nicht erwähnt werden. Der <DirectoryMatch>
Abschnitt erwähnt einen subtilen Unterschied:
Kompatibilität
Vor 2.3.9 galt diese Direktive implizit für Unterverzeichnisse (wie
<Directory>
) und konnte nicht mit dem Zeilenende-Symbol ($) übereinstimmen. In Version 2.3.9 und höher sind nur Verzeichnisse, die dem Ausdruck entsprechen, von den beigefügten Anweisungen betroffen.
Darüber hinaus würde ich gerne wissen:
- Gibt es weitere Unterschiede zwischen den Match- und Nicht-Match-Richtlinien?
- Welche Direktive ist vorzuziehen, wenn ein regulärer Ausdruck erforderlich ist?
- Sind andere Informationen Ihrer Meinung nach relevant?
Anmerkungen
<DirectoryMatch>
und<Directory "~">
sind auf der gleichen Zusammenführungsebene- Obwohl nicht explizit erwähnt,
<Directory "~">
können benannte Gruppen und Rückreferenzen verwendet werden, genau wie<DirectoryMatch>
.
quelle
<Directory ~
und<DirectoryMatch
nicht<Directory
. Bis Apache 2.3.9<Directory ~
war wohl die Obermenge, weil es den$
Regex-Anker unterstützte, während<DirectoryMatch
dies nicht der Fall war . (Dies könnte auch der Grund gewesen sein, warum die Empfehlung zur VerwendungDirectoryMatch
in den früheren Dokumenten entfernt wurde?)DirectoryMatch
ist immer noch überlegen, da sieDirectory ~
nur nach" normalen "Directory
Anweisungen behandelt werden undDirectoryMatch
Sie Daten erfassen können, die Sie anschließend verwenden können." - aber wie vom OP festgestellt, sind diese Richtlinien in beiden Punkten gleich.DirectoryMatch
leichter zu lesen und daher vorzuziehen ist (gegenüberDirectory ~
). Die Dokumente geben dies zwar nicht explizit an,DirectoryMatch
werden jedoch in allen aktuellen Beispielen verwendet (z. B. auf der Seite " Konfigurationsabschnitte ") und werdenDirectory ~
nie erwähnt. In den Dokumenten wird jedoch ausdrücklich angegeben, dass die ähnlich benanntenLocationMatch
undFilesMatch
der entsprechenden~
Version dieser Anweisungen vorzuziehen sind .DirectoryMatch
hat den$
Anker vor Apache 2.3.9 nicht unterstützt ? Die Commits, die ich gefunden habe, beziehen sich bisher auf Apache 1.2 / 1.3.<Directory ~
sogar den End-of-String-Anker enthielten. Ja, ich sehe, dass diese Commits von 1.2 / 1.3 stammen - gutes Graben! :) Es ist auch in den Apache 1.3-Dokumenten angegeben, alsDirectoryMatch
es eingeführt wurde. Es gab auch Änderungen in Apache 1.3 (von 1.2) hinsichtlich der Zusammenführung der Regex-Container (dh<Directory ~
der gerade eingeführten<DirectoryMatch
).Kein strikter Unterschied zwischen den beiden Regex-Versionen (
<Directory ~
und<DirectoryMatch
), aber einige Direktiven wieAllowOverride
undAllowOverrideList
sind nur in einem einfachen<Directory>
Container (ohne Regex) zulässig . Das schließt also sowohl<Directory ~
und aus<DirectoryMatch
.Referenz:
https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
quelle