插件窝 干货文章 Nginx的try_files指令在PHP中有哪些不同的用法及区别?

Nginx的try_files指令在PHP中有哪些不同的用法及区别?

请求 files 处理 文件 520    来源:    2025-03-15

try_files 是 Nginx 中一个非常强大的指令,用于在请求到达时尝试查找文件或目录。在 PHP 应用中,try_files 通常用于处理静态文件、重定向请求到 PHP 解释器(如 PHP-FPM),以及处理 404 错误等。以下是 try_files 在 PHP 环境中的几种常见用法及其区别:

1. 静态文件处理

try_files 可以用于检查请求的文件是否存在,如果存在则直接返回该文件,否则继续处理请求。

location / {
    try_files $uri $uri/ =404;
}
  • $uri:尝试匹配请求的 URI 对应的文件。
  • $uri/:如果 $uri 不存在,尝试匹配请求的 URI 对应的目录。
  • =404:如果前两者都不存在,返回 404 错误。

2. 将请求转发给 PHP-FPM

当请求的文件不存在时,try_files 可以将请求转发给 PHP-FPM 处理。

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
  • try_files $uri =404;:首先检查请求的 PHP 文件是否存在,如果不存在则返回 404 错误。
  • fastcgi_pass:将请求转发给 PHP-FPM 处理。

3. 处理前端控制器模式(Front Controller Pattern)

在 MVC 框架(如 Laravel、Symfony)中,通常使用前端控制器模式,所有请求都通过 index.php 处理。

location / {
    try_files $uri $uri/ /index.php?$query_string;
}
  • $uri:尝试匹配请求的 URI 对应的文件。
  • $uri/:尝试匹配请求的 URI 对应的目录。
  • /index.php?$query_string:如果前两者都不存在,将请求重写到 index.php,并将查询字符串传递给 index.php

4. 处理静态文件和前端控制器

结合静态文件处理和前端控制器模式,try_files 可以同时处理静态文件和动态请求。

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
  • 第一个 location 块处理静态文件和前端控制器。
  • 第二个 location 块处理 PHP 文件,确保 PHP 文件存在后将其转发给 PHP-FPM。

5. 处理 404 错误

try_files 也可以用于自定义 404 错误页面。

location / {
    try_files $uri $uri/ /custom_404.html;
}

location = /custom_404.html {
    internal;
}
  • try_files $uri $uri/ /custom_404.html;:如果请求的文件或目录不存在,返回自定义的 404 页面。
  • location = /custom_404.html { internal; }:确保自定义的 404 页面只能通过内部重定向访问。

6. 处理重定向

try_files 还可以用于处理重定向。

location /old-path {
    try_files $uri /new-path;
}

location /new-path {
    # 处理新路径的逻辑
}
  • try_files $uri /new-path;:如果 /old-path 不存在,重定向到 /new-path

总结

  • 静态文件处理try_files 可以用于检查并返回静态文件。
  • PHP 请求转发try_files 可以确保 PHP 文件存在后将其转发给 PHP-FPM。
  • 前端控制器模式try_files 可以将所有请求重写到前端控制器(如 index.php)。
  • 自定义 404 错误try_files 可以用于返回自定义的 404 页面。
  • 重定向try_files 可以用于处理路径重定向。

这些用法可以根据实际需求灵活组合,以满足不同的应用场景。