thinkphp 5.1 在 nginx 下启用伪静态需将 location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } } 置于 location ~ \.php$ 之前,root 指向 public 目录,并按子目录部署调整路径。

ThinkPHP 5.1 在 Nginx 下启用伪静态,location 配置是关键环节,写错位置、顺序或语法都会导致 404 或参数丢失。它不是加一段规则就完事,而是要和 PHP 处理逻辑、入口路径、PATH_INFO 解析严格对齐。
location 必须放在正确的位置
Nginx 的匹配是有优先级的,如果伪静态规则被 PHP 的 location ~ \.php$ 块提前拦截,请求根本不会走到你的重写逻辑里。
- 必须把伪静态相关的
location / { ... }块,写在location ~ \.php$ { ... }块之前 - 不能嵌套在其他 location 内(比如不能放在
location /admin/里面再套一个location /) - 若站点配置中已有默认的
location /,要直接替换,不要新增多个同级location /
location 内部不能漏掉核心判断条件
TP5.1 依赖 PATH_INFO 模式解析路由,所以转发前必须确认请求的 URI 不对应真实文件或目录。
-
if (!-e $request_filename)是必需的,不能省略括号或写成-f(那是判断文件,不包含目录) - 不能用
break替代last:用break会导致子目录部署时路由参数截断,例如访问/myapp/user/list可能只传过去/user/list,丢失前缀 - 重写目标必须是
/index.php?s=$1,其中s=是 TP5.1 默认的 PATH_INFO 入口参数名,不可改成q=或其他
root 路径与入口文件必须一致
TP5.1 推荐将 public/ 设为网站根目录(尤其在新版小皮、宝塔中),否则重写路径会出错。
-
root指令必须指向项目public/目录,例如:root "/www/wwwroot/myapp/public"; - 重写规则中的
/index.php实际就是public/index.php,所以root指对了,Nginx 才能找到它 - 如果
root错误地指向了项目根目录(如/myapp),那就要把重写目标写成/public/index.php?s=$1,但更推荐统一用 public 作 root
子目录部署需额外处理 location 路径
当项目访问地址是 http://example.com/myapp/ 这类二级路径时,原始规则会失效,因为 $1 匹配的是完整 URI,而入口文件实际在 /myapp/public/。
- 应单独定义带前缀的 location:
location /myapp/ { if (!-e $request_filename) { rewrite ^/myapp/(.*)$ /myapp/index.php?s=$1 last; } } -
root仍保持为项目根目录(如/www/wwwroot/example.com),不能指向/myapp子目录 - 确保该 location 块也在
location ~ \.php$之前,且不与其他location /冲突
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











