正确写法是 location / { try_files $uri $uri/ /index.php?s=$uri&$args; },其中 $uri 提供路由路径,&$args 保留原始查询参数,确保 ThinkPHP 能正确解析路由和 $_GET。

在 ThinkPHP 6.0 中,Nginx 的伪静态规则需确保所有非静态资源请求都正确转发到 index.php,并保留原始 URL 路径作为 s 参数(即 PATH_INFO 模式),同时兼容 ?s=xxx 和路由参数。
你提到的写法:
try_files $uri $uri/ /index.php?s=$args;
存在明显问题:$args 是查询字符串(query string),比如 ?a=1&b=2,而 ThinkPHP 6 的 ?s= 后面需要的是路由路径(如 /user/list),不是查询参数。直接用 $args 会导致路由解析失败。
✅ 正确写法应使用 $uri(不含查询参数的路径)来构造 s 参数:
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
关键说明:
-
$uri是当前请求的路径部分(如/user/info),正好对应 ThinkPHP 的s参数值; -
&$args用于保留原始查询参数(如/user/info?id=123→s=/user/info&id=123),否则$_GET会丢失; - 必须加
&$args,否则?id=123这类参数无法透传给 PHP。
完整推荐配置(含静态文件优化)
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
# 静态资源缓存(可选但建议)
location ~ \.(js|css|png|jpg|gif|svg|ico|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
注意事项:
- 确保 ThinkPHP 的
app.url_domain_deploy为false(默认),且app.app_host为空,避免域名部署干扰; - 若项目部署在子目录(如
https://example.com/api/),需配合location ^~ /api/并调整root和rewrite; - 不要遗漏
&$args,否则带问号的 URL(如/user?id=1)中id将不可见; -
index.php文件必须真实存在在 Web 根目录下,且 Nginx 有执行权限。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











