Я посмотрел документацию по nginx, и она до сих пор меня полностью смущает.
Как try_files
работай? Вот что говорится в документации:
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;
затем он проверит пути в следующем порядке:
$document_root/app/cache/index.php
$document_root/app/cache/index.html
$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;
}