Como posso usar SetEnvIf para definir uma variável com base no host HTTP?


11

Estou tentando definir uma variável no Apache

ENV = DEV se o host http for o URL do desenvolvedor

ou

ENV = PRD se o host http for o URL prd

e então use $ _SERVER ['ENV'] para criar algumas ramificações lógicas

Até agora, nenhum deles funcionou para mim e temos o módulo setenvif instalado

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

Qual é o caminho certo para fazer isso?

Respostas:


15

Examinando rapidamente a documentação :

A diretiva SetEnvIf define variáveis ​​de ambiente com base nos atributos da solicitação. O atributo especificado no primeiro argumento pode ser uma das três coisas:

Um campo de cabeçalho de solicitação HTTP (consulte RFC2616 para obter mais informações sobre estes); por exemplo: Host, User-Agent, Referer e Accept-Language. Uma expressão regular pode ser usada para especificar um conjunto de cabeçalhos de solicitação.

Portanto, certamente é possível tornar uma variável de ambiente condicional no Hostcabeçalho. Parece que você está tentando usar o Refererou Remote_Hostcabeçalhos, nenhum dos quais é exatamente o que você quer (embora, em teoria, Refererdeve conter o valor do Hostcabeçalho na maioria dos casos). Remote_Hostseria o nome do host do cliente que está fazendo a solicitação, que não é exatamente o que você deseja (e na maioria das configurações simplesmente não estaria disponível, pois é comum ter as pesquisas de DNS desativadas por motivos de desempenho).

Tente algo como isto:

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

... e use $ _SERVER ['ENV'] para criar algumas ramificações lógicas

Mas observe também que você pode simplesmente referenciar o valor do Hostcabeçalho diretamente no PHP sem passar por essa trapaça; $_SERVER['HTTP_HOST']terá exatamente o que você quer.


Lindo. Isso permite que eu escreva regras personalizadas para exigir senhas ao conectar-se a certos hosts, mas não a outros (ou seja, proteja a caixa de teste quando uma VM for clonada em várias instâncias do Amazon EC2, mas não escreva receitas personalizadas do Chef). Funcionalidade muito útil, se difícil de pesquisar.
Eric L.

1
Os SetEnvIfdocumentos dizem que o terceiro parâmetro é uma expressão regular. Os pontos no nome de domínio não devem ser escapados com uma barra invertida? Ou citar o valor entre aspas duplas faz o Apache tratá-lo como uma string literal?
jakub.g

@ jakub.g Sim, eles são regex e devem ser escapados. Nesse caso, como um ponto corresponde a qualquer caractere único, uma "www-dev.example.com"regex também corresponderá a nomes de host inesperados, como www-dev-example.com. Você receberá as correspondências esperadas e muito mais. Atualizei o exemplo agora.
Martijn Heemels
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.