用 try_files 优化 PHP 入口重写:先检查 $uri 和 $uri/,再交由 @rewrite 处理;命名 location 封装重写逻辑,兜底路径需匹配框架约定(如 Laravel 用 /index.php?$query_string);PHP 块内加 try_files $uri =404 并动态设置 SCRIPT_FILENAME。

用 try_files 优化 PHP 项目入口重写,核心是让 Nginx 在转发前先确认文件是否存在,只把“真不存在”的请求交给 index.php,既保静态资源直出,又避免误重写和循环跳转。
优先检查真实文件和目录
在 location / 块中写明检查顺序:
-
$uri:匹配精确路径,如/style.css、/logo.png,存在就直接返回 -
$uri/:匹配目录,如/assets/,若该路径是真实目录且启用index指令,会自动尝试index.html等 - 兜底项必须是能触发 PHP 处理的路径或命名 location,不能是裸
rewrite
用命名 location 封装重写逻辑
把动态路由处理单独抽到 @rewrite 中,更清晰也更安全:
- 主 location 只做判断,不写 rewrite,防止和正则 location 冲突
- 命名 location 不对外暴露,仅内部跳转,浏览器地址栏不变
- 重写后加
last,确保新 URI(如/index.php?...)能重新匹配到location ~ \.php$块
适配不同框架的参数传递方式
兜底目标要和框架入口约定一致:
立即学习“PHP免费学习笔记(深入)”;
- Laravel/Symfony 类:用
/index.php?$query_string,保持原始查询参数完整 - ThinkPHP 5/6:推荐
/index.php?s=$uri&$args,s=是其标准路由参数 - 自定义路由:可结合
rewrite提取路径段,比如rewrite ^/(\w+)$ /index.php?username=$1 last;
配合 PHP 处理块做最后校验
确保 location ~ \.php$ 块内有防御性检查:
- 加上
try_files $uri =404;,防止恶意构造.php/xxx绕过入口 -
fastcgi_param SCRIPT_FILENAME必须基于$document_root动态拼接,不能写死路径 - 确认
root指向的是public/目录(如 ThinkPHP)或项目根(如 Laravel),否则$document_root/index.php会找不到



















