try_files 是 Nginx 核心指令,无需启用模块,版本 ≥0.7.26 即支持;用于伪静态路由,需置于 location / 块内,配合 root/alias 使用,并避免与 if 混用或写绝对路径。

直接用 try_files 实现伪静态路由,不需要额外安装或启用模块——它是 Nginx 的核心指令,编译时默认内置,无需手动管理模块。
为什么不用管模块
try_files 属于 Nginx 核心功能,不是第三方模块(如 ngx_http_rewrite_module 也默认开启)。只要 Nginx 版本 ≥ 0.7.26(2009 年起),该指令就可用。检查方法:
- 运行
nginx -V 2>&1 | grep -o with-http_rewrite_module,有输出即表示 rewrite 模块已启用(try_files依赖它) - 更简单:直接在配置中写
try_files $uri /index.html;,若启动不报错,说明完全可用
基础伪静态配置写法
根据后端类型选择 fallback 目标:
-
单页应用(Vue/React/Vite):
try_files $uri $uri/ /index.html; -
ThinkPHP/Laravel 等 PHP 框架:
try_files $uri $uri/ /index.php?$query_string;或更兼容的/index.php?s=$uri&$args;
注意:必须放在 location / { ... } 块内,且 root 或 alias 要正确指向包含 index.html 或 index.php 的目录。
避免常见配置陷阱
这些错误会导致伪静态失效或 500 错误:
- 把
try_files写在location ~ \.php$块里——它只应出现在通用请求入口(如location /) - 混用
if (!-e $request_filename)和try_files——二者逻辑重叠,Nginx 官方明确建议优先用try_files替代if - fallback 路径写成绝对路径(如
/var/www/app/index.html)——try_files中最后一个参数是内部 URI,必须以/开头,相对 server 根路径解析
配合 PHP 处理的完整闭环
仅靠 try_files 还不够,PHP 请求需能真正被正确执行:
- 确保
location ~ \.php$块中包含:fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - 禁用可能导致 PATH_INFO 干扰的配置,例如删除
fastcgi_split_path_info行(尤其对 ThinkPHP 6+ 和 Laravel) - 验证
fastcgi_params文件是否含fastcgi_param QUERY_STRING $query_string;,否则$_GET为空



















