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 usaríamos ${} e %{} ?

link menciona:

The values of variables defined with the Define of or shell environment variables can be used in configuration file lines using the syntax ${VAR}.

link menciona:

Server-Variables:These are variables of the form %{ NAME_OF_VARIABLE }

e

RewriteMap expansions:These are expansions of the form ${mapname:key|default}.

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

Uma variável configurada no httpd.conf usando SetEnvIf Directive, para uso no mesmo httpd.conf, deve ser usada como ${var} , exceto quando a variável é usada com a diretiva mod_rewrite, em que a variável seria usada como %{var} ?

    
por e70 01.04.2012 / 00:01

2 respostas

3

What is the difference between ${var} and %{var} in httpd.conf?

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

Will ${VAR} be used everywhere in httpd.conf, except in mod_rewrite directive's

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

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

Would a variable set in httpd.conf using SetEnvIf Directive, for use in same httpd.conf, be used as ${var} except when the variable is used with mod_rewrite directive's, where the variable would be used as %{var}?

Não. As variáveis de ambiente não são as mesmas que as variáveis definidas por -D ou Define - elas são um contexto completamente separado por solicitação (são aquelas que você está definindo com SetEnvIf ), que somente determinadas diretivas usarão. Eles são mencionados especificamente onde são suportados - no mod_rewrite eles são %{ENV:variable} , em logs eles são %{variable}e , e muitas diretivas têm uma verificação lógica que parece com env=variable .

Então, basicamente; é uma bagunça confusa - um testemunho da história do servidor web nas últimas duas décadas. Provavelmente, a principal coisa que está confundindo você é que a sintaxe do mod_rewrite não se estende a nenhuma outra parte da configuração de forma alguma; é tudo diferente. O principal ponto a se tirar de tudo isso é que não há uma regra governamental para fazer tudo isso fazer sentido - um $ em um ponto significa algo completamente diferente de um $ em outro ponto.

Alguns pontos de referência úteis:

  1. Se você quiser definir uma variável estaticamente quando o Apache iniciar, use Define e ${VAR} para substituir 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 de produção, mas não deve ser confundido com o uso do $ de RewriteMap , que sempre contém : . / li>
  2. Se você deseja trabalhar com variáveis em solicitações específicas, as variáveis de ambiente são o que procura, mas não pode fazer suposições sobre a sintaxe usada para usá-las quando usada com uma diretiva específica. Você precisará verificar a documentação para essa diretiva.
  3. Quando o mod_rewrite está em questão, jogue fora tudo que você achou que sabia sobre variáveis e sua sintaxe. Ele possui seu próprio conjunto de variáveis em %{VAR} , você pode obter suas variáveis de ambiente 'normais' com %{ENV:VAR} e pode definir variáveis de ambiente com [E=VAR] .
por 07.04.2012 / 09:08
0

Eu olhei o código-fonte do mod_rewrite e descobri as notas nos comentários (do_expand function):

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

parece, como% são para variáveis exatas, enquanto $ são para pesquisas em tabelas de hash ("mapas"). também, todas as expansões mod_rewrite são completamente independentes da expansão core-whole feita no módulo por si só.

Eu já tinha pensado antes, mas isso estava errado:

${} vars are uses environment of project, and evaluated at time of config parse.

%{} vars are uses environment of request, and evaluated at time request parsed. mod_rewrite uses %{} symantic to prevent config-time interpolation made by httpd core.

    
por 01.04.2012 / 08:25