try_files如何工作?


72

我看了看nginx文档,它仍然使我完全困惑。

try_files工作如何?文档说明如下:

从NginxHttpCoreModule

try_files

语法:try_files path1 [path2] uri

默认值:无

上下文:服务器,位置

可用性:0.7.27

按顺序检查文件是否存在,并返回找到的第一个文件。后面的斜杠表示目录-$ uri /。如果找不到文件,则调用内部重定向到最后一个参数。最后一个参数是后备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检查缓存文件夹?我一直在尝试,但失败了。

Answers:


64

try_files尝试相对于已定义的根指令指定您指定的文字路径,并设置内部文件指针。如果您使用try_files /app/cache/ $uri @fallback;with,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指令发出内部重定向)


2
这更清楚了。谢谢。我不太确定指定位置的工作方式。如果@fallback有fastcgi php的行,它将作为php文件而不是文本?当一切都失败之前会使用回退吗?

2
除了只能通过内部机制(例如error_page和try_files)访问之外,命名位置在功能上与普通位置相同。try_files中的后备仅在没有指定的路径生成有效文件时使用。您仍然需要一个位置来捕获\ .php $ URI,否则try_files将在$ uri上触发(如果该文件存在并将其用作纯文本)。
Martin Fjordvald 2011年

谢谢您的答复。.我仍然在这里有一个问题:try_files是否立即执行,还是会尝试使用嵌套位置?
斯特凡

@Stphane您正在搬入浑浊的水域。nginx中的继承是复杂,混乱且完全不一致的。我必须回顾我的旧笔记只是为了记住这一点,因此不能保证,但是对于try_files而言,尤其是仅在处理嵌套位置时,如果内部位置匹配,将不会执行。不过,我建议您对其进行测试。
马丁·峡湾

5

这是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;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.