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