try_files 是 Nginx 中一个非常强大的指令,用于在请求到达时尝试查找文件或目录。在 PHP 应用中,try_files 通常用于处理静态文件、重定向请求到 PHP 解释器(如 PHP-FPM),以及处理 404 错误等。以下是 try_files 在 PHP 环境中的几种常见用法及其区别:
try_files 可以用于检查请求的文件是否存在,如果存在则直接返回该文件,否则继续处理请求。
location / {
try_files $uri $uri/ =404;
}
$uri:尝试匹配请求的 URI 对应的文件。$uri/:如果 $uri 不存在,尝试匹配请求的 URI 对应的目录。=404:如果前两者都不存在,返回 404 错误。当请求的文件不存在时,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 处理。在 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。结合静态文件处理和前端控制器模式,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。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 页面只能通过内部重定向访问。try_files 还可以用于处理重定向。
location /old-path {
try_files $uri /new-path;
}
location /new-path {
# 处理新路径的逻辑
}
try_files $uri /new-path;:如果 /old-path 不存在,重定向到 /new-path。try_files 可以用于检查并返回静态文件。try_files 可以确保 PHP 文件存在后将其转发给 PHP-FPM。try_files 可以将所有请求重写到前端控制器(如 index.php)。try_files 可以用于返回自定义的 404 页面。try_files 可以用于处理路径重定向。这些用法可以根据实际需求灵活组合,以满足不同的应用场景。