Declarando uma variável no .htaccess para determinar o ambiente de implementação

1

Eu tenho a seguinte regra definida no arquivo .htaccess.

RewriteRule ^/home$          http://someothersite.com/home
RewriteRule ^/dir1/dir2/$        http://someothersite.com/dir1/dir2/

Eu preciso definir o link como uma variável .htaccess. Essa variável mudaria dependendo do local do ambiente de implementação. É possível fazer isso?

Eu tenho a 3 ambientes de ambientes de implementação: build, dev e stage. Para cada um dos ambientes, um arquivo .htaccess na compilação deve redirecionar para três sites externos.

i.e.

  • build: o arquivo .htaccess deve redirecionar para o build.someothersite.com
  • dev: o arquivo .htaccess deve redirecionar para dev.someothersite.com
  • estágio: o arquivo .htaccess deve redirecionar para o stage.someothersite.com

Em vez de criar três arquivos .htaccess diferentes para cada um dos três ambientes diferentes, quero criar apenas um arquivo .htaccess sem codificar o nome do host: build.someothersite.com, dev.someothersite.com, stage.someothersite.com.

Eu preciso de algo assim:

RewriteRule ^/home.html =>%{ENV:external_host}/build.html

É possível definir uma variável %{ENV:external_host} externamente no ambiente build, dev ou stage usando alguma diretiva SetEnv? Por exemplo, a variável definiria algo como o seguinte:

  • SetEnv = dev.someothersite.com no dev,
  • SetEnv = build.someothersite.com
  • SetEnv = stage.someothersite.com no palco, respectivamente.
por tintin 03.09.2010 / 18:31

3 respostas

4

Tenha em mente que as variáveis de ambiente são locais para o escopo do usuário em execução. Ou seja o $ home resolveria para a pasta inicial do usuário na qual o apache está sendo executado. isto é, / root ou / home / apache ou / sbin / nologin ou alguma outra versão. Então, a questão é ... quais variáveis você está tentando usar?

    
por 03.09.2010 / 18:44
2

Sua pergunta não faz muito sentido. Parece que você decidiu por uma solução usando "variáveis". Você deve indicar o problema real. O Apache é muito flexível e alguém pode ter uma maneira melhor de fazer isso.

Não obstante, através do mod_rewrite você tem acesso a variáveis ambientais usando% {ENV: variable} no RewriteCond e você as configura usando a diretiva SetEnv. A questão se torna como onde você vai definir a variável? Não posso responder a essa pergunta a menos que você diga o que quer dizer com "localização". Se por "localização" você quer dizer vhost então você o configura na configuração vhost.

Uma abordagem alternativa pode estar usando um RewriteMap.

    
por 03.09.2010 / 19:14
1

Parece que você quer usar uma variável condicional dentro do Apache. Eu faço isso usando um script shell para definir condicionalmente uma variável no ambiente shell, que é então herdada pelo Apache ao reiniciar.

Você pode definir variáveis de ambiente shell em /etc/apache2/envvars no Ubuntu, /usr/local/etc/apache22/envvars.d/ no FreeBSD. No CentOS / RHEL, acho que o arquivo correto é /etc/sysconfig/httpd , mas não tenho certeza.

O script de inicialização do HTTPD fornecerá os arquivos quando for chamado. Essas variáveis se tornam parte do ambiente de shell do Apache e podem ser referenciadas na configuração do Apache. Sua lógica condicional pode ser tão poderosa quanto a sua necessidade aqui.

Por exemplo, tenho algo parecido com /usr/local/etc/apache22/envvars.d/hostname.env :

HOSTNAME='hostname -s'
if [ "$HOSTNAME" == "foo" ]; then
    export INCLUDE_CONFFILE = $HOSTNAME.conf
else
    export INCLUDE_CONFFILE = default.conf
done

E então eu uso essa variável de ambiente no meu httpd.conf principal:

# We have some host-specific settings for some hosts.
# INCLUDE_CONFFILE is inherited from envvars.d/hostname.env
Include etc/apache22/Includes/${INCLUDE_CONFFILE}

Essas variáveis também devem ser legíveis em arquivos .htaccess.

Observe que as variáveis de ambiente do sistema operacional são completamente diferentes das variáveis de ambiente do Apache. não confunda os dois. O manual do Apache HTTP Server diz : "Embora essas variáveis sejam referidas como variáveis de ambiente, elas não são mesmo que as variáveis de ambiente controladas pelo sistema operacional subjacente. "

    
por 03.09.2010 / 19:30

Tags