Por que nginx “return 301” e ”try_files“ caem em um loop infinito

Por que nginx “return 301” e ”try_files“ caem em um loop infinito

meu código conf:

index index.html index.php;
location / {
    if ($uri = '/a/') {
        return 301 https://example.com/a;
    }
    try_files $uri $uri/ =404; 
}

Se url for /a/, 301 para /a, então try_filesparte, adicione /ao /afinal, torne-se /a/.

Próximo passo, acho que ele tentará a indexdefinição, se tornará /a/index.htmle chegará ao arquivo.

Mas, na verdade, ele tentou /a/e saltou para fora location, depois entrou locationnovamente, para if ($uri = '/a/') { ... }.

Então um loop infinito.

Ora, fiquei confuso.


O que eu quero fazer é

  1. Se request example.com/a/, pule para example.com/a, depois para 2
  2. Se request example.com/a, mostre example.com/a/index.html(mas o URL é example.com/a).

Alguém pode me ajudar a chegar a isso?

Responder1

Está fazendo exatamente o que deveria fazer.

Você nunca pode alcançá-lo /a/index.htmlporque continua redirecionando de volta para /aantes que isso aconteça. Quando o nginx processa isso, ele vê o diretório no sistema de arquivos e redireciona automaticamente (corretamente) para /a/.

Você deve remover este redirecionamento inadequado.

Responder2

Bem-vindo ao ServerFault. Você pode fazer o que é mencionado no OP com o seguinte código...

location / {
    if ($uri = '/a/') {
        return 301 https://example.com/a;
    }
    try_files $uri $uri/index.html =404; 
}

Por favor, veja a pergunta relevante e a resposta aceita emRemovendo a barra final de um URL com nginx.

Basicamente, não precisamos depender indexe sim servir index.htmldiretamente quando example.com/asolicitado.

informação relacionada