try_files
如何工作?文档说的是:来自NginxHttpCoreModule
try_files
语法:try_files path1 [path2] uri
默认值:无
上下文:服务器,位置
可用性:0.7.27
按顺序检查文件是否存在,并返回找到的第一个文件
。后面的斜杠表示目录-$ uri /。在未找到文件的
事件中,将调用对last
参数的内部重定向。最后一个参数是后备URI,并且必须存在
,否则将引发内部错误。与重写不同,如果后备不是命名位置,则不会自动保留$ 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;
与index index.php index.html;
一起使用,则它将按以下顺序测试路径:/>
$document_root/app/cache/index.php
,最后内部内部重定向到@fallback命名位置。您还可以使用文件或状态码(
$document_root/app/cache/index.html
)作为最后一个参数,但是如果使用文件,它必须存在。最后一个参数。这意味着您无法执行以下操作:$document_root$uri
那样将导致nginx将内部文件指针设置为$ document_root / cache.php并为其提供服务,但是由于未进行内部重定向,因此不会重新评估位置,因此作为纯文本。 (它与PHP文件一起用作索引的原因是index指令将发出内部重定向)#2 楼
这是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;
}
评论
实际上,所有这些操作只是尝试文件_,失败,然后使用后备。如果您在document_root中创建文件_,所有这些规则将失败。
– w00t
19年12月2日在11:45
@ w00t-这是一个需要注意的好地方。如果Nginx有goto语句,它将很有用。
–克雷格·希克斯(Craig Hicks)
19/12/2在14:39
评论
这更清楚了。谢谢。我不太确定指定位置的工作方式。如果@fallback有fastcgi php的行,它将用作php文件而不是文本?当一切都失败之前会使用回退吗?
–user274
2011年11月11日下午5:13
除了只能通过内部机制(例如error_page和try_files)访问之外,命名位置在功能上与普通位置相同。 try_files中的后备仅在没有指定的路径生成有效文件时使用。您仍然需要一个位置来捕获\ .php $ URI,否则try_files将在$ uri上触发(如果该文件存在并将其用作纯文本)。
–马丁·峡湾(Martin Fjordvald)
2011年11月11日20:33
谢谢您的答复。.我仍然在这里有一个问题:try_files是否立即执行,还是会尝试使用嵌套位置?
– Stphane
16年1月6日在23:20
@Stphane您正在搬入浑浊的水域。 nginx中的继承是复杂,混乱且完全不一致的。我不得不回顾我的旧笔记只是为了记住这一点,所以不能保证,但是对于try_files而言,尤其是仅在处理嵌套位置时,如果内部位置匹配,则不会执行。不过,我建议您对其进行测试。
–马丁·峡湾(Martin Fjordvald)
16年1月11日,下午6:07