Назад | Перейти на главную страницу

Как работает try_files?

Я посмотрел документацию по nginx, и она до сих пор меня полностью смущает.

Как try_files работай? Вот что говорится в документации:

Из NginxHttpCoreModule

try_files

синтаксис: try_files путь1 [путь2] uri

по умолчанию: нет

контекст: сервер, местоположение

доступность: 0.7.27

Проверяет наличие файлов по порядку и возвращает первый найденный файл. Завершающая косая черта указывает на каталог - $ uri /. Если файл не найден, выполняется внутреннее перенаправление на последний параметр. Последний параметр - резервный URI и должен существует, иначе возникнет внутренняя ошибка. В отличие от rewrite, $ args не сохраняется автоматически, если резервное копирование не является именованным расположением. Если вам нужно сохранить аргументы, вы должны сделать это явно:

Я не понимаю, как он проверяет пути и что, если мне не нужна внутренняя ошибка, но нужно ли возобновить оставшуюся часть пути, чтобы найти другой файл?

Если я хочу попробовать кешированный файл на /path/app/cache/url/index.html и если не получится /path/app/index.php как бы я это написал? Если бы я написал:

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;

у меня есть index index.php index.html index.htm;. Когда я приезжаю /urlname, он попробует проверить /path/app/cache/urlname/index.php затем /path/app/cache/urlname/index.html? Если мы проигнорируем все после try_files это возможно для try_files проверить папку кеша? Я пытался и потерпел неудачу.

try_files пробует буквальный путь, указанный вами относительно определенной корневой директивы, и устанавливает внутренний указатель файла. Если вы используете, например, try_files /app/cache/ $uri @fallback; с участием index index.php index.html; затем он проверит пути в следующем порядке:

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

перед окончательным внутренним перенаправлением в указанное место @fallback. Вы также можете использовать файл или код состояния (=404) в качестве последнего параметра, но при использовании файла должен существовать.

Следует отметить, что сам try_files не будет выполнять внутреннее перенаправление ни для чего, кроме последнего параметра. Это означает, что вы не можете делать следующее: try_files $uri /cache.php @fallback; так как это приведет к тому, что nginx установит внутренний указатель файла на $ document_root / cache.php и будет обслуживать его, но поскольку внутреннего перенаправления не происходит, местоположения не переоцениваются, и поэтому они будут обслуживаться как простой текст. (Причина, по которой он работает с файлами PHP в качестве индекса, заключается в том, что директива индекса воля выполнить внутреннее перенаправление)

Вот еще одно удобное использование try_files в качестве безусловного перенаправления в названные местоположения. Именованные местоположения эффективно действуют как подпрограммы, сохраняя дублирование кода. Когда первым аргументом try_files является _ всегда выполняется резервное перенаправление (при условии, что _ не является существующим именем файла). Поскольку nginx нуждается в goto заявление, но его нет.

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