"Ocultar" .html extensiones de archivo usando nginx reescribe

16

Estoy sirviendo un sitio estático a través de nginx, y mi objetivo es reemplazar las URL que se ven así:

http://foo.com/bar.html

con

http://foo.com/bar

La clave no es una barra inclinada final. Actualmente estoy haciendo algo similar usando alias de ubicación, pero esto es tedioso porque requiere un bloque de ubicación para cada archivo, y también agrega una barra diagonal ya que nginx mira los alias como directorios:

    location / {
        root    /srv/www/foo/public_html;
        index   index.html;
    }

    location /bar1 {
        alias /srv/www/foo/public_html/;
        index bar1.html;
    }

    location /bar2 {
        alias /srv/www/foo/public_html/;
        index bar2.html;
    }

Y así. He leído la documentación sobre reescrituras, y parece que no puedo sintetizar lo que se dice sobre lo que necesito que haga. No voy a venir de un fondo Apache; nginx es mi primera incursión en los servidores web, así que estoy seguro de que me falta algo obvio ya que mi fondo HTTP es débil. Gracias de antemano por cualquier ayuda que pueda proporcionar.

Doug Stephen
fuente

Respuestas:

17

try_files Debería ser lo que quieres.

Algo como esto:

try_files $uri.html $uri $uri/ =404;
Shane Madden
fuente
1
Esto funcionó, con la pequeña excepción de que $ uri.html estaba causando un 500. Tuve que usar "$ {uri} .html".
Doug Stephen
44
Cambiarlo a try_files $uri.html $uri/ =404;sería mejor SEO, ya que no tendría dos URL foobar.com/bar y foobar.com/bar.html apuntando al mismo recurso.
Khaja Minhajuddin
5

Según el comentario de @Khaja, la mejor respuesta es:

try_files $uri.html $uri/ =404;

Para que solo se sirva una copia del recurso (sin extensión .html). No desea dividir la fuerza de su enlace en varias URL que sirven contenido duplicado. Encuentra la documentación aquí .

Bryce
fuente
Intenté esto try_files $ uri.html $ uri / = 404; se rompió carga de página sin nominar myurl / índice también carga la quiebra de css, js, etc
aspiringGuru