try_files 如何工作?

try_files 如何工作?

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

它是如何try_files工作的?文档中是这样说的:

来自 NginxHttpCoreModule

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;,它将按以下顺序测试路径:

  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

这是 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;
    }

相关内容