try_files 如何工作?

91 nginx

我查看了 nginx 文档,但它仍然让我感到非常困惑。

如何try_files工作?以下是文档中的内容:

来自 NginxHttpCoreModule

尝试文件

语法: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;
Run Code Online (Sandbox Code Playgroud)

我有index index.php index.html index.htm;。当我访问/urlname,它会尝试检查/path/app/cache/urlname/index.php然后/path/app/cache/urlname/index.html?如果我们忽略一切之后try_files是否可以try_files检查缓存文件夹?我一直在努力,但失败了。

Mar*_*ald 81

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

  • 命名位置在功能上与普通位置相同,只是它只能通过内部机制(例如 error_page 和 try_files)访问。try_files 中的回退仅在没有指定路径生成有效文件时使用。您仍然需要一个位置来捕获 \.php$ URI,否则如果文件存在,try_files 将在 $uri 上触发并将其作为纯文本提供。 (4认同)
  • 这要清楚得多。谢谢。我有点不确定命名位置是如何工作的。如果@fallback 有用于 fastcgi php 的行,可以将其作为 php 文件而不是文本使用?当一切都失败之前是否使用回退? (3认同)

Cra*_*cks 10

这是 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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 实际上,所有这些都是尝试文件`_`,失败,然后使用回退。如果您在“document_root”中创建文件“_”,所有这些规则都将失败。 (2认同)
  • @w00t您可以使用空参数,正如我在[此处](https://serverfault.com/a/1100562/498657)所述,它应该使这样的配置更加可靠。 (2认同)