«Masquer» les extensions de fichier .html à l'aide de réécritures nginx

16

J'utilise un site statique via nginx, et mon objectif est de remplacer les URL qui ressemblent à:

http://foo.com/bar.html

avec

http://foo.com/bar

La clé étant l'absence de barre oblique. Je fais actuellement quelque chose de similaire en utilisant des alias d'emplacement, mais cela est fastidieux car cela nécessite un bloc d'emplacement pour chaque fichier, et il ajoute également une barre oblique car nginx regarde les alias comme des répertoires:

    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;
    }

Etc. J'ai lu la documentation sur les réécritures, et je n'arrive pas à synthétiser ce qui est dit dans ce que j'ai besoin de faire. Je ne viens pas d'un milieu Apache; nginx est ma première incursion sur les serveurs Web, donc je suis sûr que je manque quelque chose d'évident car mon arrière-plan HTTP est faible. Merci d'avance pour toute aide que vous pouvez fournir.

Doug Stephen
la source

Réponses:

17

try_files devrait être ce que vous voulez.

Quelque chose comme ça:

try_files $uri.html $uri $uri/ =404;
Shane Madden
la source
1
Cela a fonctionné, à l'exception mineure que $ uri.html provoquait un 500. J'ai dû utiliser "$ {uri} .html".
Doug Stephen
4
Le changer try_files $uri.html $uri/ =404;serait mieux en termes de référencement, car vous n'auriez pas deux URL foobar.com/bar et foobar.com/bar.html pointant vers la même ressource.
Khaja Minhajuddin
5

Selon le commentaire de @Khaja, la meilleure réponse est:

try_files $uri.html $uri/ =404;

Pour qu'une seule copie de la ressource soit servie (celle sans extension .html). Vous ne voulez pas diviser la force de votre lien sur plusieurs URL diffusant du contenu en double. Trouvez la documentation ici .

Bryce
la source
J'ai essayé ça. try_files $ uri.html $ uri / = 404; il a cassé le chargement de la page d'accueil sans nommer myurl / index a également cassé le chargement de .css, .js etc.
aspiringGuru