Variáveis ​​httpd.conf: Qual é a diferença entre $ {var} e% {var}?


7

Qual é a diferença entre ${var}e %{var}no httpd.conf?

Como e quando alguém usaria ${}e %{}?

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

Os valores das variáveis ​​definidas com as variáveis ​​de ambiente Definir ou Shell podem ser usados ​​nas linhas do arquivo de configuração usando a sintaxe $ {VAR}.

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

Variáveis ​​do servidor: são variáveis ​​no formato% {NAME_OF_VARIABLE}

e

Expansões RewriteMap: são expansões no formato $ {mapname: key | default}.

Será ${VAR}usado em qualquer lugar no httpd.conf, exceto nas diretivas mod_rewrite (como RewriteCond, RewriteRule, mas exceto nas expansões RewriteMap que usam ${}como em RewriteRule ^ / ex /(.*) $ {examplemap: $ 1} )

Uma variável definida no httpd.conf usando a SetEnvIfDiretiva, para uso no mesmo httpd.conf, seria usada como ${var}exceto quando a variável for usada com a diretiva mod_rewrite, onde a variável seria usada como %{var}?

Respostas:


5

Qual é a diferença entre $ {var} e% {var} no httpd.conf?

Praticamente tudo. Não existe uma regra rígida que diga " $faz x, %faz y", porque eles fazem coisas diferentes dependendo de onde e como são usados.

O $ {VAR} será usado em qualquer lugar no httpd.conf, exceto nas diretivas mod_rewrite

Não - ${VAR}é aplicado como uma substituição em todos os locais da configuração, mesmo em uma linha relacionada ao mod_rewrite. Eles só podem ser definidos na inicialização usando a -Dopção passada para o binário httpd ou a Definediretiva.

Isso pode ser feito porque essas variáveis ​​não devem conter um :caractere, enquanto o RewriteMapuso deve conter um :caractere. Isso permite $que ele seja usado de maneiras extremamente diferentes, sem conflitos - o analisador vê :e sabe que não deveria estar substituindo isso.

Uma variável definida no httpd.conf usando a Diretiva SetEnvIf, para uso no mesmo httpd.conf, seria usada como $ {var}, exceto quando a variável for usada com a diretiva mod_rewrite, em que a variável seria usada como% {var}?

Variáveis No. ambiente não são o mesmo que variáveis definidas via -Dou Define- eles são um contexto completamente separado por solicitação (esses são os que você está definindo com SetEnvIf), que apenas determinadas directivas irá utilizar. Eles são mencionados especificamente onde são suportados - no mod_rewrite %{ENV:variable}, nos logs %{variable}e, e muitas diretivas têm uma verificação lógica que se parece env=variable.


Então, basicamente; é uma bagunça confusa - um testemunho da história do servidor da web nas últimas duas décadas. Provavelmente a principal coisa que o confunde é que a sintaxe do mod_rewrite não se estende a nenhuma outra parte da configuração; é tudo diferente. O ponto principal a ser tirado de tudo isso é que não existe uma 'regra' governante para fazer tudo isso fazer sentido - $um local significa algo completamente diferente de $outro local.

Alguns pontos de referência úteis:

  1. Se você deseja definir uma variável estaticamente quando o Apache iniciar, use Definee ${VAR}substitua uma vez na inicialização do Apache. Isso é útil principalmente quando você deseja fazer algo como compartilhar arquivos de configuração entre um ambiente de desenvolvimento e produção - mas não deve ser confundido com o uso do $from RewriteMap, que sempre contém a :.
  2. Se você deseja trabalhar com variáveis ​​em solicitações específicas, as variáveis ​​de ambiente são o que você procura - mas não é possível fazer suposições sobre a sintaxe que você usará para obtê-las quando usada com uma diretiva específica. Você precisará verificar a documentação dessa diretiva.
  3. Quando o mod_rewrite estiver em questão, jogue fora tudo o que você pensou que sabia sobre variáveis ​​e sua sintaxe. Ele possui seu próprio conjunto de variáveis %{VAR}, você pode obter as variáveis ​​de ambiente 'normais' %{ENV:VAR}e definir variáveis ​​de ambiente [E=VAR].

Uau! obrigado por uma escrita tão longa! Vou levar um tempo para digerir isso. Muito estranho que os documentos do Apache não documentem isso em um só lugar, isso deve ser bastante confuso para muitos iniciantes.
X10

Sim - os documentos deles não são ruins para conceitos específicos, mas o material geral é muito menos claro.
Shane Madden

1

Eu olhei o código fonte do mod_rewrite e descobri que as notas nos comentários (função do_expand):

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

parece que% é para variáveis ​​exatas, enquanto $ é para pesquisas em tabelas de hash ("mapas"). Além disso, todas as expansões mod_rewrite são completamente independentes da expansão do núcleo - toda feita no módulo por si só.

Eu pensei antes, mas isso estava errado:

$ {} vars são ambientes de uso do projeto e avaliados no momento da análise da configuração.

% {} vars são ambientes de solicitação usados ​​e avaliados no momento em que a solicitação é analisada. mod_rewrite usa% {} symantic para impedir a interpolação em tempo de configuração feita pelo httpd core.


Obrigado. Você poderia incluir o link para a documentação original e, se possível, o link para um tutorial?
X10

Eu nunca vi isso em texto não criptografado na documentação. É assim que eu entendo por que isso foi feito. E que estava errado :)
datacompboy
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.