¿Por qué Nginx acepta cualquier valor de URL después del dominio raíz?

¿Por qué Nginx acepta cualquier valor de URL después del dominio raíz?

La primera vez que configuro Nginx y mi objetivo es que example.com tenga una página estática 'index.html' con una configuración minimalista, nada más. También quiero eliminar el subdominio www. Aquí están los bloques de servidores disponibles en mis sitios:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;

    location / {
            try_files $uri $uri/ /index.html;
    }
}

Si uso www.example.com o example.com, funcionan bien y www se elimina automáticamente.

Mi problema es que puedo escribir cualquier cosa después de example.com y la página index.html aún se carga, como example.com/ABC o example.com/12345.Estas páginas no existen, ¿por qué se aceptan las URL? Esperaría que cualquier URL que no sea la raíz del dominio devuelva una página 404.

Probablemente este sea un problema muy simple, pero intenté buscar aquí y en los documentos y hasta ahora no encontré nada.

Respuesta1

Parece el comportamiento correcto de la cláusula try_files. De la wiki de nginx:

Comprueba la existencia de archivos en orden y devuelve el primer archivo que se encuentra. Una barra diagonal indica un directorio: $uri /. En caso de que no se encuentre ningún archivo, se invoca una redirección interna al último parámetro. Tenga en cuenta que solo el último parámetro provoca una redirección interna, los anteriores simplemente configuran el puntero URI interno.

Entonces, si busca ABC o 12345, que no se pueden encontrar, se invoca una redirección interna a index.html.

Prueba con:

location / {
    try_files $uri $uri/ =404;
}

Busque aquí una referencia completa:

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

Basado en el libro de Martin FjordvaldcomentarioAquí está la configuración mínima para los dos bloques de servidores, probada y funcionando:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;
}

Respuesta2

2 cosas que se me ocurren:

o tienes una reescritura para volver al index.html

o es posible que tenga una página 404 personalizada que esté vinculada a index.html

Al menos esas serían las 2 ideas que comprobaría primero.

Otra posible solución sería verificar los registros, establecer valores para depurar y verificar qué lo "redirecciona" nuevamente al index.html. Lamentablemente, no conozco nginx lo suficientemente bien como para ayudarlo más.

información relacionada