核心是服务器正确转发请求且框架严格匹配路由:Nginx需用双try_files将非静态请求回退至/index.php?s=$uri&$args,同时ThinkPHP必须启用强制路由(url_route_on=true、url_route_must=true)并为所有路径显式定义路由规则。

ThinkPHP在强制路由模式下隐藏index.php,核心是“服务器正确转发请求 + 框架严格按路由匹配”,缺一不可。单纯配Nginx而忽略框架配置,或只开路由却没处理fallback逻辑,都会导致404。
确保框架启用并适配强制路由
强制路由('url_route_must' => true)意味着所有请求必须有明确的路由规则,否则直接报错。此时不能依赖默认的模块/控制器/操作路径解析,所以:
- 打开
config/app.php,确认已设置:'url_route_on' => true,'url_route_must' => true, - 检查
app/route.php中是否为每个需要访问的URL定义了对应路由,例如:Route::get('user/profile', 'user.Profile/index'); - 若项目含首页、登录页等基础路径,必须显式添加,如:
Route::get('/', 'index/index');或Route::get('home', 'index/home'); - ThinkPHP 6.x 还需确认中间件未禁用
think\middleware\ParseUrl,该中间件负责将请求路径转为路由参数
Nginx配置必须回退到index.php且不破坏PATH_INFO
强制路由下,Nginx不能再把请求错误地交给静态文件或空路径处理,所有未命中真实资源的请求,都必须交由index.php统一入口解析路由。推荐使用双try_files方案:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
root 必须指向 public 目录,例如:
root /var/www/myapp/public; - 主 location 块写成:
location / { try_files $uri $uri/ /index.php?s=$uri&$args; } - PHP 处理块保持简洁,不加 rewrite,不拆 PATH_INFO(除非你明确启用并配置了 PATH_INFO 模式):
location ~ \.php$ {<br> try_files $uri /index.php?s=$uri&$args;<br> fastcgi_pass 127.0.0.1:9000;<br> fastcgi_index index.php;<br> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br> include fastcgi_params;<br>} - 切勿在 PHP 块中添加
rewrite指令——这会干扰s=参数传递,导致路由解析失败
验证与排错关键点
配置后仍出现404?重点排查这三个环节:
立即学习“PHP免费学习笔记(深入)”;
-
浏览器访问
/或/user/profile时,Network面板查看请求是否返回200且内容为预期页面;若返回404,说明Nginx未成功转发到index.php -
查看PHP错误日志(如
/var/log/nginx/error.log或php-fpm.log),是否有File not found或Primary script unknown——通常因SCRIPT_FILENAME路径错误或root未指向public -
临时关闭强制路由测试:把
'url_route_must'设为false,再访问相同URL。若能显示(哪怕带index.php),说明Nginx配置基本正确,问题出在路由定义缺失或不匹配 - 静态资源(CSS/JS/图片)必须可直访,否则页面样式错乱。确认其路径如
/static/css/app.css在Nginx中返回200,而非被index.php接管
补充:子目录部署需同步调整
若项目不在根目录(例如部署在https://example.com/myapp/),Nginx需做两处适配:
- server 块中 root 不变(仍为
public目录),但 location 匹配前缀改为:location /myapp/ { alias /var/www/myapp/public/; }(注意末尾斜杠) - 主 location 内的 fallback 路径要带子目录:
try_files $uri $uri/ /myapp/index.php?s=$uri&$args; - 同时在
config/app.php中设置'app_subdomain_deploy' => true,并确保'app_host' => ''或正确填写域名


















