我查看了 nginx 文档,但它仍然让我非常困惑。
它是如何try_files
工作的?文档中是这样说的:
try_files
语法:try_files path1 [path2] uri
默认值: none
上下文:服务器,位置
可用性:0.7.27
按顺序检查文件是否存在,并返回找到的第一个文件。尾部斜杠表示目录 - $uri /。如果未找到任何文件,则调用内部重定向到最后一个参数。最后一个参数是后备 URI, 必须存在,否则将引发内部错误。与重写不同,如果 fallback 不是命名位置,则不会自动保留 $args。如果需要保留 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
检查缓存文件夹?我一直在尝试,但失败了。
答案1
try_files 会尝试您指定的与定义的 root 指令相关的文字路径并设置内部文件指针。如果您使用例如try_files /app/cache/ $uri @fallback;
with 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 文件作为索引的原因是 index 指令将要发出内部重定向)
答案2
这是 try_files 的另一个方便用法,即无条件重定向到指定位置。指定位置实际上充当子例程,从而节省了代码重复。当 try_files 的第一个参数是_
fallback 重定向时,始终会采用该重定向(假设它_
不是现有文件名)。因为 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;
}