Comment puis-je utiliser SetEnvIf pour définir une variable basée sur l'hôte Http?


11

J'essaie de définir une variable sur Apache

ENV = DEV si l'hôte http est l'URL de développement

ou

ENV = PRD si l'hôte http est l'URL prd

puis utilisez $ _SERVER ['ENV'] pour créer des branches logiques

Jusqu'à présent, aucun de ces éléments n'a fonctionné pour moi et nous avons installé le module setenvif

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

Quelle est la bonne façon de procéder?

Réponses:


15

Jetons un coup d'œil à la documentation :

La directive SetEnvIf définit des variables d'environnement en fonction des attributs de la demande. L'attribut spécifié dans le premier argument peut être l'une des trois choses:

Un champ d'en-tête de requête HTTP (voir RFC2616 pour plus d'informations à ce sujet); par exemple: Host, User-Agent, Referer et Accept-Language. Une expression régulière peut être utilisée pour spécifier un ensemble d'en-têtes de demande.

Il est donc certainement possible de conditionner une variable d'environnement à l'en- Hosttête. Il semble que vous essayiez d'utiliser les en Referer- Remote_Hosttêtes ou , ce qui n'est pas exactement ce que vous voulez (bien qu'en théorie, il Refererdevrait contenir la valeur de l'en- Hosttête dans la plupart des cas). Remote_Hostserait le nom d'hôte du client qui fait la demande, ce qui n'est pas du tout ce que vous voulez (et dans la plupart des configurations, il ne serait tout simplement pas disponible, car il est typique de désactiver les recherches DNS pour des raisons de performances).

Essayez quelque chose comme ceci:

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

... puis utilisez $ _SERVER ['ENV'] pour créer des branches logiques

Mais notez également que vous pouvez simplement référencer la valeur de l'en- Hosttête directement en PHP sans passer par cette chicane; $_SERVER['HTTP_HOST']aura exactement ce que vous voulez.


Belle. Cela m'a permis d'écrire des règles personnalisées pour exiger des mots de passe lors de la connexion à certains hôtes, mais pas à d'autres (c'est-à-dire protéger la boîte de transfert lorsqu'une machine virtuelle est clonée sur plusieurs instances Amazon EC2, mais n'écrivez pas de recettes Chef personnalisées). Fonctionnalité très utile, si difficile à rechercher.
Eric L.

1
Les SetEnvIfdocs disent que le 3ème paramètre est une expression régulière, les points du nom de domaine ne devraient-ils pas être échappés avec une barre oblique inverse? Ou le fait de citer la valeur entre guillemets fait-il qu'Apache la traite comme un littéral de chaîne?
jakub.g

@ jakub.g Oui, ils sont une expression régulière et doivent être échappés. Dans ce cas, puisqu'un point correspond à n'importe quel caractère, une "www-dev.example.com"expression régulière correspondra également à des noms d'hôtes inattendus, tels que www-dev-example.com. Vous obtiendrez les matchs attendus et plus encore. J'ai mis à jour l'exemple maintenant.
Martijn Heemels
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.