httpd.conf-Variablen: Was ist der Unterschied zwischen $ {var} und% {var}?

7

Was ist der Unterschied zwischen ${var}und %{var}in httpd.conf?

Wie und wann würde man ${}und verwenden %{}?

http://httpd.apache.org/docs/2.4/configuring.html erwähnt:

Die Werte von Variablen, die mit den Umgebungsvariablen Definieren von oder Shell definiert wurden, können in Konfigurationsdateizeilen mit der Syntax $ {VAR} verwendet werden.

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html erwähnt:

Servervariablen: Dies sind Variablen der Form% {NAME_OF_VARIABLE}

und

RewriteMap-Erweiterungen: Dies sind Erweiterungen der Form $ {mapname: key | default}.

Wird ${VAR}überall in httpd.conf verwendet, außer in der Anweisung mod_rewrite (wie RewriteCond, RewriteRule, aber mit Ausnahme von RewriteMap-Erweiterungen, die ${}wie in RewriteRule ^ / ex /(.*) verwendet werden. $ {Examplemap: $ 1} )

Würde eine in httpd.conf unter Verwendung der SetEnvIfDirektive festgelegte Variable zur Verwendung in derselben httpd.conf verwendet, ${var}außer wenn die Variable mit mod_rewrite-Direktiven verwendet wird, in denen die Variable als verwendet würde %{var}?

X10
quelle

Antworten:

5

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 -Dan die httpd-Binärdatei oder die DefineDirektive übergebenen Option definiert werden .

Dies kann erfolgen, da diese Variablen kein :Zeichen enthalten dürfen , während die RewriteMapVerwendung 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 -Doder festgelegt wurden. DefineSie 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}eund 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:

  1. Wenn Sie beim Start von Apache eine Variable statisch festlegen möchten, verwenden Sie diese beim Start von Apache Defineund ${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 :.
  2. 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.
  3. 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].
Shane Madden
quelle
Beeindruckend! danke für das so lange schreiben! Ich werde eine Weile brauchen, um das zu verdauen. Es ist ziemlich seltsam, dass Apache-Dokumente dies nicht an einem Ort dokumentieren. Dies muss für viele Neulinge ziemlich verwirrend sein.
X10
Ja - ihre Dokumente sind nicht schlecht für bestimmte Konzepte, aber das 'Big Picture'-Zeug wie dieses ist viel weniger klar.
Shane Madden
1

Ich habe mir den Quellcode von mod_rewrite angesehen und festgestellt, dass Notizen in Kommentaren (do_expand-Funktion):

        /* variable lookup */
        else if (*p == '%') {
        ...
        /* map lookup */
        else {     /* *p == '$' */

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:

$ {} vars verwendet die Projektumgebung und wird zum Zeitpunkt der Konfigurationsanalyse ausgewertet.

% {} vars verwendet die Anforderungsumgebung und werden zum Zeitpunkt der Analyse der Anforderung ausgewertet. mod_rewrite verwendet% {} symantic, um eine Interpolation der Konfigurationszeit durch den httpd-Kern zu verhindern.

Datacompboy
quelle
Vielen Dank. Könnten Sie bitte den Link zur Originaldokumentation dazu und, wenn möglich, den Link zu einem Tutorial hinzufügen?
X10
Ich habe das noch nie im Klartext in der Dokumentation gesehen. So habe ich verstanden, warum das gemacht wurde. Und das war falsch :)
Datacompboy