Question nginx try_files pour réécrire le fichier .html dans une URL «propre»


Voici le répertoire contenant les fichiers HTML statiques

public
|-- index.html
|-- media
|   `-- blurred_image-8.jpg
|-- post
|   `-- 13considerations
|       `-- index.html

J'essaie de configurer nginx pour convertir toutes les URL se terminant par .html dépouiller le suffixe.

Comme ça:-

server {
    listen       80;
    server_name  mysite.com;

    location / {
        root   /var/www/mysite/public;
        try_files  $uri  $uri/ $uri/index.html;
    }

    location /media/ {
        alias /var/www/mysite/public/media/;
        error_page 404 = /404;
        expires 30d;
    }

    location /static/ {
        alias /var/www/mysite/public/static/;
        error_page 404 = /404;
        expires 30d;
    }
}

Cela fonctionne correctement pour la page d'accueil "http://monsite.com/"mais si j'essaye d'accéder"http://monsite.com/post/13considerations/", Je reçois une erreur de 500 serveur interne.

Ce qui donne?


5
2017-11-20 09:35


origine




Réponses:


L’exemple que vous utilisez fonctionne pour renvoyer le contenu d’un répertoire index.html fichier, mais ne fonctionnera pas pour les fichiers (par exemple, http://server/somedir/file ne retournera pas le contenu de /somedir/file.html).

Une configuration simplifiée, qui retournera n'importe quel fichier HTML sans son extension et utilisera index.html pour les répertoires est la suivante:

server {
    listen       80;
    server_name  mysite.com;

    index index.html;
    root /var/www/mysite/public;

    location / { 
        try_files $uri $uri/ @htmlext;
    }   

    location ~ \.html$ {
        try_files $uri =404;
    }   

    location @htmlext {
        rewrite ^(.*)$ $1.html last;
    }   
}

Comment ça marche:

  • En précisant index index.html utilisera par défaut ce fichier lors de l'accès aux URI du répertoire.
  • En mettant root en dehors de location bloc s'appliquera à l'échelle du serveur.
  • try_files $uri $uri/ @htmlext va d'abord rechercher une correspondance exacte pour un fichier ou un répertoire avant d'essayer finalement d'ajouter .html.
  • try_files $uri =404 est d'empêcher Nginx de rester bloqué dans une boucle de réécriture si un fichier est introuvable.
  • rewrite ^(.*)$ $1.html last ajoute .html et redémarre le processus de correspondance d'URI.

13
2017-11-20 10:01



Cela fonctionne très bien, sauf pour un petit défaut. Si je vais sur "mysite.com/index.html", cela ne redirige pas vers "mysite.com". Et seulement pour ce particulier index.html; pour chaque autre URL, par exemple en utilisant ma question initiale ci-dessus, si je visite "mysite.com/post/13considerations/index.html", je suis correctement redirigé vers "mysite.com/post/13considerations/" - Calvin Cheng
cette solution est-elle conviviale pour le référencement? Tout comme le PO, j'aimerais aussi savoir comment rediriger le chemin racine /index.html déposer dans / - xperator
@xperator ça fait un moment que j'ai écrit la configuration ci-dessus, mais il devrait servir le contenu de /index.html pour / sur tous les répertoires, y compris la racine (par exemple, http://example.com/) en raison de l index index.html déclaration. En ce qui concerne le référencement, ce qui précède prend le contenu du fichier au lieu de le rediriger. Vous pouvez donc essayer de le remplacer. rewrite ^(.*)$ $1.html last; avec rewrite ^(.*)$ $1.html redirect; ou rewrite ^(.*)$ $1.html permanent; - plasmid87