Come posso usare SetEnvIf per impostare una variabile basata sull'Http Host?


11

Sto cercando di impostare una variabile su Apache

ENV = DEV se l'host http è l'URL di sviluppo

o

ENV = PRD se l'host http è l'URL prd

e quindi utilizzare $ _SERVER ['ENV'] per creare alcuni rami logici

Finora nessuno di questi ha funzionato per me e abbiamo installato il modulo setenvif

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

Qual è il modo giusto per farlo?

Risposte:


15

Dando una rapida occhiata alla documentazione :

La direttiva SetEnvIf definisce le variabili di ambiente in base agli attributi della richiesta. L'attributo specificato nel primo argomento può essere una delle tre cose:

Un campo di intestazione di richiesta HTTP (vedere RFC2616 per ulteriori informazioni su questi); ad esempio: Host, User-Agent, Referer e Accept-Language. Un'espressione regolare può essere utilizzata per specificare un set di intestazioni di richiesta.

Quindi, è certamente possibile subordinare una variabile d'ambiente all'intestazione Host. Sembra che tu stia provando a usare le intestazioni Referero Remote_Host, nessuna delle quali è esattamente ciò che vuoi (anche se in teoria Refererdovrebbe contenere il valore Hostdell'intestazione nella maggior parte dei casi). Remote_Hostsarebbe il nome host del client che effettua la richiesta, che non è affatto quello che si desidera (e nella maggior parte delle configurazioni non sarebbe semplicemente disponibile, poiché è tipico avere ricerche DNS disattivate per motivi di prestazioni).

Prova qualcosa del genere:

SetEnvIf Host "www-dev\.example\.com" ENV=DEV
SetEnvIf Host "www-production\.example\.com" ENV=PRD

... e quindi utilizzare $ _SERVER ['ENV'] per creare alcuni rami logici

Ma nota anche che puoi semplicemente fare riferimento al valore Hostdell'intestazione direttamente in PHP senza passare attraverso questa chicanery; $_SERVER['HTTP_HOST']avrà esattamente quello che vuoi.


Bellissimo. Questo mi consente di scrivere regole personalizzate per richiedere password quando ci si connette a determinati Host, ma non ad altri (ad esempio, proteggere la casella di gestione temporanea quando una VM viene clonata su più istanze di Amazon EC2, ma non scrivere ricette Chef personalizzate). Funzionalità molto utile, se difficile da cercare.
Eric L.,

1
I SetEnvIfdocumenti dicono che il 3o parametro è una regex, i punti nel nome di dominio non dovrebbero essere sfuggiti a una barra rovesciata? Oppure citando il valore tra virgolette doppie, Apache lo considera come una stringa letterale?
jakub.g,

@ jakub.g Sì, sono una regex e dovrebbero essere evitati. In questo caso, poiché un punto corrisponde a qualsiasi singolo carattere, una "www-dev.example.com"regex corrisponderà anche a nomi host imprevisti, come ad esempio www-dev-example.com. Otterrai le partite previste e altro ancora. Ho aggiornato l'esempio ora.
Martijn Heemels,
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.