Por qué nginx "return 301" y "try_files" caen en un bucle infinito

Por qué nginx "return 301" y "try_files" caen en un bucle infinito

mi código de configuración:

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

Si la URL es /a/301 a /a, entonces try_filesparte, agrega /al /afinal, conviértete en /a/.

El siguiente paso, creo que probará la indexdefinición, se convertirá en /a/index.htmly alcanzará el archivo.

Pero en realidad, lo intentó /a/y saltó location, luego volvió a locationentrar if ($uri = '/a/') { ... }.

Luego un bucle infinito.

Vaya, simplemente me confundí.


Lo que quiero hacer es

  1. Si lo solicita example.com/a/, salte a y example.com/aluego a 2
  2. Si lo solicita example.com/a, muéstrelo example.com/a/index.html(pero la URL es example.com/a).

¿Alguien puede ayudarme a llegar a esto?

Respuesta1

Está haciendo exactamente lo que debe hacer.

Nunca podrás llegar /a/index.htmlporque sigues redireccionando /aantes de que esto pueda suceder. Cuando nginx procesa esto, ve el directorio en el sistema de archivos y lo redirige automáticamente (correctamente) a /a/.

Deberías eliminar esta redirección inapropiada.

Respuesta2

Bienvenido a ServerFault. Puedes hacer lo que se menciona en el OP con el siguiente código...

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

Consulte la pregunta relevante y la respuesta aceptada enEliminar la barra diagonal final de una URL con nginx.

Básicamente, no tenemos que depender de nosotros index, sino que servimos index.htmldirectamente cuando example.com/ase nos solicita.

información relacionada