必须用 last 而非 break,因 last 使重写后 URI 重新匹配 location,确保 /index.php?s=... 进入 PHP 处理块;break 则终止匹配导致 404 或源码下载。

不要加 break,必须用 last,且不能和 break 混用。
last 的作用是让重写后的请求(如 /index.php?s=/user/info)重新进入 location 匹配流程,这样才能被后续的 location ~ \.php$ 块正确捕获并交给 PHP 解析。如果用了 break,重写会终止在当前 location 内,Nginx 不再尝试匹配其他 location,结果就是 /index.php?s=... 被当作静态路径处理——找不到该文件,最终返回 404 或直接下载 index.php 源码。
常见错误写法:
rewrite ^(.*)$ /index.php?s=$1 last; break; ← 这行完全多余,语法上虽不报错,但逻辑冲突,应删除
正确写法(精简、可靠):
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
补充说明:
-
last后 Nginx 会用新 URI(即/index.php?s=...)再次查找匹配的location,确保进到 PHP 处理块; -
if在location中虽被 Nginx 官方标记为“不推荐”,但在宝塔 + TP6 场景下仍是兼容性最稳的选择; - 若用
try_files替代if,推荐写法是:try_files $uri $uri/ /index.php?$query_string;
注意这里用的是$query_string(等价于$args),能完整保留原始 URL 中的查询参数(如?page=2&sort=id)。
入口文件路径必须准确:TP6 实际入口是 public/index.php,所以 Nginx 的 root 应指向项目根目录(如 /www/wwwroot/myapp),而规则中 /index.php 实际对应的是 root/public/index.php —— 这要求你的站点 root 配置已正确指向项目根,并且 public 是 Web 可访问子目录。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











