try_files 是 Nginx 中的一个指令,用于按顺序检查文件或目录是否存在,并根据检查结果决定如何处理请求。如果所有指定的文件或目录都不存在,Nginx 将返回最后一个参数指定的状态码或执行指定的操作。

语法

try_files file ... uri;
try_files file ... =code;
  • file:要检查的文件或目录路径。

  • uri:如果前面的文件或目录都不存在,Nginx 将尝试使用该 URI 处理请求。

  • =code:如果前面的文件或目录都不存在,Nginx 将返回指定的 HTTP 状态码。

案例

案例 1:静态文件处理

假设你有一个静态网站,希望 Nginx 先检查请求的文件是否存在,如果不存在则返回 index.html

server {
    listen 80;
    server_name example.com;

    root /var/www/html;

    location / {
        try_files $uri $uri/ /index.html;
    }
}
  • $uri:检查请求的文件是否存在。

  • $uri/:检查请求的目录是否存在。

  • /index.html:如果前面的文件或目录都不存在,Nginx 将返回 index.html

案例 2:动态请求转发

假设你有一个动态应用,希望 Nginx 先检查静态文件是否存在,如果不存在则将请求转发给后端应用服务器。

server {
    listen 80;
    server_name example.com;

    root /var/www/html;

    location / {
        try_files $uri $uri/ @backend;
    }

    location @backend {
        proxy_pass http://backend_server;
    }
}
  • $uri:检查请求的文件是否存在。

  • $uri/:检查请求的目录是否存在。

  • @backend:如果前面的文件或目录都不存在,Nginx 将请求转发给 @backend 指定的 location 块,即 proxy_pass 到后端服务器。

案例 3:自定义错误页面

假设你希望在文件不存在时返回自定义的 404 页面。

server {
    listen 80;
    server_name example.com;

    root /var/www/html;

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    location = /404.html {
        internal;
    }
}
  • $uri:检查请求的文件是否存在。

  • $uri/:检查请求的目录是否存在。

  • =404:如果前面的文件或目录都不存在,Nginx 将返回 404 状态码,并显示自定义的 404.html 页面。

总结

try_files 指令非常灵活,可以用于处理静态文件、动态请求转发以及自定义错误页面等场景。通过合理配置,可以显著提高 Nginx 的处理效率和用户体验。

本篇文章内容来源于:Nginxtry_files 文件判断指令详细说明以及案例