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

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指令将发出内部重定向)

评论


这更清楚了。谢谢。我不太确定指定位置的工作方式。如果@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

#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