Configure um pega-tudo dentro de um local com fallback para index.php

2

Estou lutando com a configuração do nginx. Eu tenho um bloco server no qual desejo que todas as solicitações acessem index.php?tags=$uri , a menos que $uri exista (como index.php?a=b ou /?a=b ).

Eu esperaria:

try_files $uri index.php?tags=$uri;

mas, não, isso seria simples demais. Isso não funciona para /?a=b , que aparentemente não foi encontrado, então ele direciona para index.php?tags=/

Talvez se eu incluir explicitamente um index , o que é razoável:

index index.php;

Não. Sem dados. O mesmo resultado exato em todo o quadro.

Além disso, nada com $args , $request_uri ou combinações. Também não é:

try_files $request_uri/index.php $request_uri index.php?tags=$request_uri; // now I'm just guessing

O Apache de alguma forma sabia o que eu sempre quis dizer. Por que não faz nginx? Eu gostaria desses redirecionamentos (sem redirect ou if ):

/   => /index.php
/index.php   => /index.php
/index.php?a=b   => /index.php?a=b
/?a=b   => /index.php?a=b
/foo   => /index.php?tags=foo (or /index.php?tags=/foo)
/foo/bar   => /index.php?tags=foo/bar (or /index.php?tags=/foo/bar)
/foo?bar=yes   => /index.php?tags=/foo%3Fbar%3Dyes

Eu gostaria que a string de consulta fosse codificada quando redirecionada, mas não o caminho, mas realmente isso não é tão importante.

(Eu também não entendo a diferença prática entre $ uri e $ request_uri. Eles parecem estar fazendo a mesma metade do tempo. Mas isso é para outro dia.)

Muito obrigado.

    
por Rudie 27.01.2014 / 23:44

1 resposta

2

Estou alcançando o resultado desejado com o seguinte snippet de configuração:

location = / {
    index index.php;
}

location / {
    try_files $uri /index.php?tags=$request_uri;
}

try_files tenta ... arquivos. Quando você procura / com ele, você procura por um arquivo com o mesmo nome, ele não é interpretado como 'localizar o arquivo de índice'. index faz esse trabalho. Portanto, você precisa separar esse caso especial do local padrão de retorno.

A melhor parte é o seu último desejo: os argumentos nem serão codificados, pois não precisam (apenas o primeiro ponto de interrogação de um URI é relevante, já que tudo o que segue é um argumento).

Lembre-se do uso de $request_uri (que contém o URI solicitado, com argumentos, mas não normaliza / limpa) em vez do normalizado $uri (que limpa o URI e remova argumentos). Assim você pode acabar com:

///foo?bar=yes => index.php?tags=///foo?bar=yes

Se você se preocupa com isso, pode usar $uri em combinação com $args :

location = / {
    index index.php;
}

location / {
    try_files $uri /index.php?tags=$uri?$args;
}

produzindo:

///foo?bar=yes => index.php?tags=/foo?bar=yes
    
por 05.11.2014 / 13:04