try_files更稳,因其是Nginx原生命令,不依赖if判断,绕过PATH_INFO解析,直接用$query_string传参,完美适配TP6的s参数路由模式,且动静分离友好、兼容性强。

用 try_files 更好。
它不是“看起来更高级”的选择,而是从机制、稳定性和兼容性上都更适配 ThinkPHP 6.0 的方案。
为什么 try_files 更稳?
- 它是 Nginx 原生命令,不依赖
if判断,避免了变量作用域、嵌套逻辑出错等隐患 - 不经过 PATH_INFO 解析,直接用
$query_string或s=参数传路由,TP6 默认的url_common_param => 's'模式能原生识别/index.php?s=home/index这类格式 - 静态资源(CSS/JS/图片)匹配优先,不存在就自动兜底到 index.php,动静分离天然友好
- 不会因
fastcgi_split_path_info配置错误导致$_SERVER['PATH_INFO']为空或错乱——这点很多 rewrite 方案踩过坑
rewrite 方案的问题点
立即学习“PHP免费学习笔记(深入)”;
- 常见写法
rewrite ^(.*)$ /index.php?s=$1 last;在反向代理、子目录部署、带查询参数的 URL 下容易失灵 - 依赖
if (!-e $request_filename),而 Nginx 官方文档明确指出if在location块中存在不可靠行为 - 宝塔等面板虽默认提供 rewrite 规则,但本质是妥协方案,适合快速启用,不适合生产环境长期依赖
实际配置建议(精简可用)
location / {
try_files $uri $uri/ /index.php?$query_string;
}配套注意:
- ✅
root必须指向public/目录(不是项目根目录) - ✅ PHP 处理块里删掉
fastcgi_split_path_info相关行(TP6 不需要,留着反而干扰) - ✅ 若部署在子目录(如
/myapp/),fallback 路径要改成/myapp/index.php?$query_string - ✅ 不要和
proxy_pass冲突:若用了反向代理,try_files必须放在proxy_pass规则之前,且避免对/api、/ws等路径误兜底
不复杂但容易忽略。



















