como remover o bloco de localização do $ uri na configuração do nginx?


15

Eu tenho uma reescrita no meu arquivo ngix conf que funciona corretamente, exceto que parece incluir o bloco de localização como parte da variável $ uri. Eu só quero o caminho após o bloco de localização. Meu código de configuração atual é:

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

Usando um exemplo de URL do http://localhost/cargo/testpageredirecionamento funciona, no entanto, o valor do parâmetro "_REWRITE_COMMAND" recebido pelo meu arquivo php é "/ cargo / testpage". Preciso retirar o bloco de localização e ter apenas "testpage" como o $ uri

Eu tenho certeza que existe uma sintaxe regex para dividir o $ uri e atribuí-lo a uma nova variável usando $ 1 $ 2 etc, mas não consigo encontrar nenhum exemplo para fazer apenas uma atribuição de variável usando um regex que não faz parte de uma reescrita declaração. Estou procurando e tentando há horas, e simplesmente não consigo superar esse último passo.

Eu também sei que eu poderia simplesmente remover isso no código do aplicativo, mas o motivo pelo qual eu quero tentar corrigi-lo no nginx conf é por motivos de compatibilidade, pois também é executado no Apache. Também devo dizer que descobri uma maneira realmente hacky de fazê-lo, mas envolve uma declaração "if" para verificar a existência de arquivos e a documentação diz especificamente para não fazê-lo dessa maneira.

Respostas:


17

Olhando em volta, eu acho que usar um local de regexp com capturas é o mais fácil. Adaptando seu exemplo, acabo com:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}

aha, tão simples quando alguém aponta para você! Eu tive que fazer algumas revisões menores para lidar com a reescrita do URL raiz no local correto. Coloquei a resposta na pergunta, pois não posso formatar este comentário. A única ressalva que resta é que o bloco php agora precisa estar acima desse bloco de localização, ou então um loop de redirecionamento infinito é criado (devido a / cargo ser uma regex e o URL de redirecionamento também conter / carga). não tem certeza se existe outra maneira de impedir que isso aconteça?
Jason

Eu recomendo ler a ordem dos locais regexp e não regexp. Normalmente, volto a fazer todos os locais regexp em algum momento, porque a ordem é determinada pela ordem no arquivo de configuração, em vez da especificidade da correspondência.
Theuni

legal obrigado, eu estava imaginando o que tornaria o regex acima melhor se ele corresponder a / cargo / (qualquer coisa, exceto index.php), então isso impediria o erro do servidor devido ao loop de reescrita infinito.
Jason

3

Encontrei outra coisa que funcionou para mim (como estou usando gunicorn, não posso escolher o que passar)

Você deve conseguir se safar

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

1

Para aqueles que podem estar com dificuldade de adicioná-lo para microsserviço ou API com o Nó JS, usei o seguinte para remover apida URL no meu servidor:

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
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.