> 文章列表 > nginx try files详解

nginx try files详解

nginx try files详解

什么是nginx try_files?

nginx try_files是nginx中一个常用的指令,它用来定义在静态资源无法访问时寻找其他备选资源的顺序。简而言之,就是当用户请求某一个静态资源时,nginx会按照try_files指令的定义规则去寻找备选资源,并最终将内容返回给用户。

语法与参数解析

try_files的语法如下:

try_files file ... uri;

其中file可以是文件名,可以包含通配符;uri则是备选资源的URI(Uniform Resource Identifier),可以包含参数和变量。

除此之外,还可以使用四个修饰符改变默认行为:

  • fallback:无论文件是否存在,都会重定向到URI,但原有URI参数会保留;
  • exists:只匹配已经存在的文件,如果文件不存在,则返回404错误;
  • fastcgi:发送到FastCGI的访问请求;
  • named:寻找命名location。

应用案例一:映射到本地文件

以下为一个最简单的try_files示例,指定了在请求一个静态资源时,先尝试寻找具有相同文件名的文件,若找不到,则返回404错误:

try_files $uri $uri/ =404;

在此示例中,假设请求的URI为http://example.com/a/b/c.jpg,首先nginx会尝试查找文件/var/www/example.com/a/b/c.jpg是否存在,若存在,则直接返回该文件的内容;如果不存在,则尝试查找能否在目录/var/www/example.com/a/b/下找到index文件,如index.html、index.htm,若找到,则返回该文件内容;如果还是没有找到,则返回404错误。

应用案例二:转发到FastCGI进程

以下示例可以将请求转发到FastCGI进程:

try_files $uri /index.php?$args; # $uri not found, then index.php is run

如果请求的URI所表示的静态文件不存在,那么就会将请求转发给FastCGI后端服务。请求会被转发到/index.php,同时在查询参数中携带了原始URI中的参数。这个示例可以用在运行PHP程序时进行优化。

应用案例三:自定义URI规则

下面的示例定义了一种特殊的URI规则,它首先尝试从nginx的默认静态资源路径中查找相应的文件,如果找到了,则使用该文件响应请求;如果没有找到,则将请求重定向到一个新路径:

location / { try_files $uri @backend;}location @backend { proxy_pass http://localhost:8080;}

在此示例中,如果请求URI /a/b/1.jpg存在,则直接返回该文件内容;如果请求URI /a/b/2.jpg不存在,就会转交到@backend位置进行处理。

应用案例四:Fallback修饰符的使用

下面的示例使用了fallback修饰符来实现特定的文件不存在时,返回默认资源的功能:

location / { try_files $uri /fallback.html =404;}location /fallback.html { internal;}

在此示例中,如果请求的静态资源存在,则直接返回该文件的内容;如果不存在,则尝试请求/fallback.html这个URI,假设这个URI不存在,那么fallback修饰符的作用就会生效,将请求重定向至=404,也就是返回一个404错误给用户。如果/fallback.html文件存在,则返回该文件内容。