Вопрос: Как работает try_files?


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

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

Из NginxHttpCoreModule

try_files

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

default: none

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

наличие: 0.7.27

Проверяет наличие файлов в порядке и возвращает первый файл   который найден. Конечная косая черта указывает каталог - $ uri /. в   событие, когда файл не найден, внутреннее перенаправление на последний   параметр вызывается. Последний параметр - это резервный URI и    должен существует, или же внутренняя ошибка будет поднята. В отличие от переписывания, $ 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 проверить папку кэша? Я пытался и потерпел неудачу.


46
2017-11-10 03:46


Источник




Ответы:


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 в качестве индекса, заключается в том, что директива index будем выдать внутреннюю переадресацию)


49
2017-11-11 01:27



Это намного яснее. Благодарю. Я немного не уверен, как работает указанное место. Если @fallback имеет строки для fastcgi php, которые будут служить в качестве файла php, а не текста? Используется ли резервное копирование, когда все до его отказа?
Именованное местоположение просто функционально идентично нормальному местоположению, за исключением того, что его можно получить только через внутренние механизмы, такие как error_page и try_files. Откат в файлах try_files используется только тогда, когда ни один из указанных путей не приводит к действительному файлу. Вам все еще нужно место для catch \ .php $ URI, так как иначе try_files будет запускаться по $ uri, если файл существует и служит ему как обычный текст. - Martin Fjordvald
Спасибо за этот ответ. У меня все еще есть вопрос: выполняется ли try_files сразу или вложенное местоположение должно быть проверено раньше? - Stphane
@Stphane Вы двигаетесь в мутные воды здесь. Наследование в nginx является сложным, беспорядочным и полностью непоследовательным. Мне пришлось просмотреть мои старые заметки, чтобы помнить об этом, поэтому никаких гарантий нет, но кажется, что для try_files, особенно при работе с вложенными локациями, не будет выполняться, если совпадение внутреннего местоположения. Я бы рекомендовал проверить его. - Martin Fjordvald


Вот еще одно удобное использование try_files, как безусловное перенаправление на именованные местоположения. Названные местоположения эффективно действуют как подпрограммы, сохраняя дублирование кода. Когда первым аргументом try_files является «_», всегда берется резервное перенаправление.

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

1
2018-03-02 04:26