web-dev-qa-db-fra.com

Comment puis-je faire fonctionner cette directive try_files?

J'essaie de comprendre comment fonctionne la directive try_files de Nginx. Nginx est exécuté sur mon serveur et affiche la page par défaut située à l'adresse /usr/share/nginx/html/index.html.

Cependant, j'ai une simple page HTML située dans le système de fichiers à l'adresse /var/www/test/index.html. Le fichier de configuration suivant ne lui permet pas d'être servi. J'aimerais comprendre pourquoi pas et quel changement je dois faire pour qu'il soit servi.

Voici la partie pertinente de default.conf:

server {
    listen       80;
    server_name  localhost;

    root  /var/www;
    try_files /test/index.html /;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
49
Jonah

une ligne très courante try_files qui peut être appliquée à votre condition est

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

vous comprenez probablement la première partie, location / correspond à tous les emplacements, sauf s’il correspond à un emplacement plus spécifique, comme location /test par exemple

La seconde partie (la try_files) signifie que lorsque vous recevez un URI correspondant à ce bloc, essayez $uri _ d'abord, par exemple http://example.com/images/image.jpg _ nginx va essayer de vérifier s’il y a un fichier dans /images appelé image.jpg si trouvé, il le servira en premier.

La deuxième condition est $uri/ _ ce qui signifie que si vous n'avez pas trouvé la première condition $uri essayez l’URI en tant que répertoire, par exemple http://example.com/images/, ngixn vérifie d’abord si un fichier nommé images existe, il ne le trouvera pas, puis passera à la deuxième vérification $uri/ et voir s’il existe un répertoire appelé images, il essaiera de le servir.

note secondaire: si vous n'avez pas autoindex on vous obtiendrez probablement une erreur 403 interdite, car la liste des répertoires est interdite par défaut .

ÉDITER : J'ai oublié de mentionner que si vous avez défini index, nginx essaiera de vérifier si l'index existe dans ce dossier avant d'essayer de lister les répertoires.

Troisième condition /test/index.html est considéré comme une option de repli (vous devez utiliser au moins deux options, une et une solution de repli), vous pouvez en utiliser autant que vous le pouvez (ne jamais lire de restriction auparavant), nginx recherchera le fichier index.html dans le dossier test et le servir s’il existe.

Si la troisième condition échoue aussi, alors nginx servira la page d'erreur 404.

En outre, il y a quelque chose appelé des emplacements nommés, comme ceci

location @error {
}

Vous pouvez l'appeler avec try_files comme ça

try_files $uri $uri/ @error;

ASTUCE : Si vous ne souhaitez remplir qu'une seule condition, comme par exemple dans le dossier images, vous souhaitez uniquement servir l'image ou passez à l'erreur 404, vous pouvez écrire une ligne comme celle-ci

location /images {
    try_files $uri =404;
}

ce qui signifie soit servir le fichier ou servir une erreur 404, vous ne pouvez pas utiliser seulement $uri par lui-même sans =404 parce que vous devez avoir une option de secours.
Vous pouvez également choisir le code d'erreur que vous voulez, comme par exemple:

location /images {
    try_files $uri =403;
}

Cela montrera une erreur interdite si l'image n'existe pas, ou si vous utilisez 500, cela montrera une erreur de serveur, etc.

170
Mohammad AbuShady