Variabili httpd.conf: qual è la differenza tra $ {var} e% {var}?


7

Qual è la differenza tra ${var}e %{var}in httpd.conf?

Come e quando si dovrebbe usare ${}e %{}?

http://httpd.apache.org/docs/2.4/configuring.html menzioni:

I valori delle variabili definite con le variabili Definisci o shell dell'ambiente possono essere utilizzati nelle righe del file di configurazione utilizzando la sintassi $ {VAR}.

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html menzioni:

Variabili del server: si tratta delle variabili del modulo% {NAME_OF_VARIABLE}

e

Espansioni di RewriteMap: si tratta di espansioni del modulo $ {mapname: key | default}.

Verrà ${VAR}utilizzato ovunque in httpd.conf, ad eccezione delle direttive mod_rewrite (come RewriteCond, RewriteRule ma tranne le espansioni di RewriteMap che usano ${}come in RewriteRule ^ / ex /(.*) $ {examplemap: $ 1} )

Una variabile impostata in httpd.conf usando la SetEnvIfDirettiva, per l'uso nello stesso httpd.conf, verrebbe usata come ${var}se non fosse quando la variabile viene usata con la direttiva mod_rewrite, dove la variabile verrebbe usata come %{var}?

Risposte:


5

Qual è la differenza tra $ {var} e% {var} in httpd.conf?

Praticamente tutto. Non esiste una regola rigida che dice " $fa x, %fa y", perché fanno cose diverse a seconda di dove e come vengono usate.

$ {VAR} sarà usato ovunque in httpd.conf, tranne nelle direttive mod_rewrite

No: ${VAR}viene applicato in sostituzione in ogni posizione della configurazione, anche in una riga relativa a mod_rewrite. Questi possono essere definiti all'avvio utilizzando l' -Dopzione passata al file binario httpd o alla Definedirettiva.

Questo può essere fatto perché tali variabili non devono contenere un :carattere, mentre l' RewriteMapuso deve contenere un :carattere. Ciò consente $di utilizzarlo in modi estremamente diversi senza conflitti: il parser vede :e sa che non dovrebbe sostituirlo.

Una variabile impostata in httpd.conf usando la direttiva SetEnvIf, per essere usata nello stesso httpd.conf, verrebbe usata come $ {var} tranne quando la variabile viene usata con la direttiva mod_rewrite, dove la variabile verrebbe usata come% {var}?

No. Le variabili di ambiente non sono le stesse delle variabili impostate tramite -Do Define- sono un contesto per richiesta completamente separato (quelli sono quelli che stai impostando SetEnvIf), che verranno utilizzate solo da alcune direttive. Sono specificamente menzionati dove supportati: in mod_rewrite sono %{ENV:variable}, nei registri sono %{variable}ee molte direttive hanno un controllo logico che sembra env=variable.


Quindi in poche parole; è un disordine confuso - una testimonianza della storia del web server negli ultimi due decenni. Probabilmente la cosa principale che ti confonde è che la sintassi di mod_rewrite non si estende a nessun'altra parte della configurazione in alcun modo; è tutto diverso. Il punto principale da prendere da tutto ciò è che non esiste una 'regola' governativa per dare un senso a tutto ciò - un $in un punto significa qualcosa di completamente diverso da un $in un altro punto.

Alcuni utili punti di riferimento:

  1. Se stai cercando di impostare staticamente una variabile all'avvio di Apache, usa Definee ${VAR}sostituisci una volta, all'avvio di Apache. Questo è utile soprattutto quando vuoi fare qualcosa come condividere file di configurazione tra un ambiente di sviluppo e produzione, ma non deve essere confuso con l'uso di $from RewriteMap, che contiene sempre a :.
  2. Se stai cercando di lavorare con variabili in richieste specifiche, allora le variabili di ambiente sono ciò che stai cercando, ma non puoi fare ipotesi sulla sintassi che utilizzerai per ottenerle quando utilizzate con una direttiva specifica. Dovrai controllare la documentazione per quella direttiva.
  3. Quando mod_rewrite è in questione, elimina tutto ciò che pensavi di sapere sulle variabili e sulla loro sintassi. Ha un proprio set di variabili %{VAR}, puoi ottenere le tue variabili di ambiente "normali" con %{ENV:VAR}e puoi impostare le variabili di ambiente con [E=VAR].

Wow! grazie per una così lunga scrittura! Mi ci vorrà un po 'per digerire questo. Abbastanza strano che i documenti di Apache non lo documentino in un unico posto, questo deve essere abbastanza confuso per molti neofiti.
X10

Sì, i loro documenti non sono dannosi per concetti specifici, ma le cose del "quadro generale" come questa sono molto meno chiare.
Shane Madden,

1

Ho esaminato il codice sorgente di mod_rewrite e ho scoperto che le note nei commenti (funzione do_expand):

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

quindi sembra che% sia per le variabili esatte, mentre $ per le ricerche nelle tabelle hash ("mappe"). inoltre, tutte le espansioni di mod_rewrite sono completamente indipendenti dal core - intera espansione fatta nel modulo da sola.

Mi è stato pensato prima, ma era sbagliato:

$ {} var sono ambienti di utilizzo del progetto e valutati al momento della configurazione dell'analisi.

% {} vars utilizza l'ambiente di richiesta e valutato al momento della richiesta analizzato. mod_rewrite usa% {} symantic per impedire l'interpolazione di configurazione configurata dal core httpd.


Grazie, potresti per favore includere il link alla documentazione originale per questo e, se possibile, il link a un tutorial?
X10

Non l'ho mai visto in chiaro testo nella documentazione. È così che ho capito perché è stato fatto. E quello era sbagliato :)
datacompboy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.