126 votes

Comment fonctionne try_files ?

J'ai regardé la documentation de nginx et cela me laisse encore complètement perplexe.

Comment try_files travail ? Voici ce que dit la documentation :

De NginxHttpCoreModule

essayer_fichiers

syntaxe : try_files path1 [path2] uri

par défaut : aucun

contexte : serveur, emplacement

disponibilité : 0.7.27

Vérifie l'existence des fichiers dans l'ordre, et retourne le premier fichier. qui a été trouvé. Une barre oblique de fin de ligne indique un répertoire - $uri /. Dans le cas où aucun fichier n'est trouvé, une redirection interne vers le dernier est invoquée. Le dernier paramètre est l'URI de repli et le paramètre doit existent, sinon une erreur interne sera levée. Contrairement à rewrite, $args n'est pas automatiquement préservé si le fallback n'est pas un emplacement nommé. Si vous souhaitez que les args soient préservés, vous devez le faire de manière explicitement :

Je ne comprends pas comment il vérifie les chemins et que faire si je ne veux pas d'une erreur interne mais qu'il reprenne le reste du chemin dans le but de trouver un autre fichier ?

Si je veux essayer un fichier en cache à /path/app/cache/url/index.html et si cela échoue, essayer /path/app/index.php comment pourrais-je écrire ça ? Si j'écrivais :

try_files /path/app/cache/ $uri
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;

J'ai index index.php index.html index.htm; . Quand je visite /urlname va-t-il essayer de vérifier /path/app/cache/urlname/index.php puis /path/app/cache/urlname/index.html ? Si on ignore tout ce qui suit try_files est-il possible pour try_files pour vérifier le dossier cache ? J'ai essayé et n'ai pas réussi.

106voto

Schotime Points 6067

Try_files essaie le chemin littéral que vous spécifiez par rapport à la directive racine définie et définit le pointeur de fichier interne. Si vous utilisez par exemple try_files /app/cache/ $uri @fallback; con index index.php index.html; alors il testera les chemins dans cet ordre :

  1. $document_root/app/cache/index.php
  2. $document_root/app/cache/index.html
  3. $document_root$uri

avant de finalement rediriger en interne vers l'emplacement nommé par @fallback. Vous pouvez également utiliser un fichier ou un code d'état ( =404 ) en tant que dernier paramètre, mais si vous utilisez un fichier, il s'agit de doit exister .

Vous devez noter que try_files lui-même n'émettra pas de redirection interne pour autre chose que le dernier paramètre. Cela signifie que vous ne pouvez pas faire ce qui suit : try_files $uri /cache.php @fallback; car cela fera en sorte que nginx définisse le pointeur de fichier interne vers $document_root/cache.php et le serve, mais comme aucune redirection interne n'a lieu, les emplacements ne sont pas réévalués et il sera donc servi en texte brut. (La raison pour laquelle cela fonctionne avec des fichiers PHP comme index est que la directive index sera effectuer une redirection interne)

16voto

fanf42 Points 870

Voici une autre utilisation pratique de try_files, comme redirections inconditionnelles vers des emplacements nommés. Les emplacements nommés agissent effectivement comme des sous-routines, ce qui évite la duplication du code. Lorsque le premier argument de try_files est _ la redirection de secours est toujours prise (en supposant que _ n'est pas un nom de fichier existant). Parce que nginx a besoin d'un goto mais n'en a pas.

    location =/wp-login.php { try_files _ @adminlock; }
    location ^~ /wp-admin/  { try_files _ @adminlock; }
    location @adminlock  {
            allow 544.23.310.198;
            deny all;
            try_files _ @backend;
            # wp-admin traffic is tiny so ok to send all reqs to backend 
    }
    location ~ \.php {  try_files _ @backend; }
    location / { try_files $uri $uri/ =403; }
    location @backend {
            fastcgi_pass 127.0.0.1:9000;
            include snippets/fastcgi-php.conf;
    }

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X