Was ist der Unterschied zwischen $ {var} und% {var} in httpd.conf?
So ziemlich alles. Es gibt keine feste Regel, die besagt: " $
macht x, %
macht y", weil sie unterschiedliche Dinge tun, je nachdem, wo und wie sie verwendet werden.
Wird $ {VAR} überall in httpd.conf verwendet, außer in der Anweisung mod_rewrite
Nein - ${VAR}
wird an jeder Stelle in der Konfiguration als Ersatz verwendet , auch in einer mod_rewrite-bezogenen Zeile. Diese können nur beim Start mit der -D
an die httpd-Binärdatei oder die Define
Direktive übergebenen Option definiert werden .
Dies kann erfolgen, da diese Variablen kein :
Zeichen enthalten dürfen , während die RewriteMap
Verwendung ein :
Zeichen enthalten muss . Dies ermöglicht die $
konfliktfreie Verwendung auf äußerst unterschiedliche Weise - der Parser sieht das :
und weiß, dass es das nicht ersetzen soll.
Würde eine in httpd.conf mithilfe der SetEnvIf-Direktive festgelegte Variable zur Verwendung in derselben httpd.conf als $ {var} verwendet, außer wenn die Variable mit mod_rewrite-Direktiven verwendet wird, wobei die Variable als% {var} verwendet würde?
Nein. Umgebungsvariablen sind nicht mit Variablen identisch, die über -D
oder festgelegt wurden. Define
Sie sind ein völlig separater Kontext pro Anforderung (mit dem Sie festlegen SetEnvIf
), den nur bestimmte Anweisungen verwenden. Sie werden ausdrücklich erwähnt, wo sie unterstützt werden - in mod_rewrite sind sie %{ENV:variable}
, in Protokollen sind sie %{variable}e
und viele Anweisungen haben eine Logikprüfung, die aussieht env=variable
.
Also im Grunde genommen; Es ist ein verwirrendes Durcheinander - ein Beweis für die Geschichte des Webservers in den letzten Jahrzehnten. Wahrscheinlich ist die Hauptsache, die Sie verwirrt, dass sich die Syntax von mod_rewrite in keiner Weise auf einen anderen Teil der Konfiguration erstreckt. es ist alles anders. Der wichtigste Punkt bei all dem ist, dass es keine maßgebliche „Regel“ gibt, die all dies sinnvoll macht - ein $
an einem Ort bedeutet etwas völlig anderes als ein $
an einem anderen Ort.
Einige nützliche Referenzpunkte:
- Wenn Sie beim Start von Apache eine Variable statisch festlegen möchten, verwenden Sie diese beim Start von Apache
Define
und ${VAR}
ersetzen Sie sie einmal. Dies ist vor allem dann nützlich, wenn Sie beispielsweise Konfigurationsdateien zwischen einer Entwicklungs- und einer Produktionsumgebung freigeben möchten. Es ist jedoch nicht zu verwechseln mit der Verwendung von $
from RewriteMap
, das immer ein enthält :
.
- Wenn Sie mit Variablen in bestimmten Anforderungen arbeiten möchten, sind Umgebungsvariablen das, wonach Sie suchen. Sie können jedoch keine Annahmen über die Syntax treffen, die Sie verwenden, um sie bei Verwendung mit einer bestimmten Direktive abzurufen. Sie müssen die Dokumentation zu dieser Anweisung überprüfen.
- Wenn mod_rewrite in Frage kommt, werfen Sie alles weg, was Sie über Variablen und deren Syntax zu wissen glaubten. Es hat einen eigenen Satz von Variablen in
%{VAR}
, Sie können zu Ihren 'normalen' Umgebungsvariablen mit gelangen %{ENV:VAR}
, und Sie können Umgebungsvariablen mit festlegen [E=VAR]
.
Ich habe mir den Quellcode von mod_rewrite angesehen und festgestellt, dass Notizen in Kommentaren (do_expand-Funktion):
Es sieht also so aus, als ob% für exakte Variablen stehen, während $ für Suchvorgänge in Hash-Tabellen ("Maps") stehen. Außerdem sind alle mod_rewrite-Erweiterungen völlig unabhängig vom Kern - die gesamte Erweiterung wird im Modul selbst durchgeführt.
Ich wurde früher gedacht, aber das war falsch:
quelle