thinkphp路由404主因是nginx未将请求转发至public/index.php:需配置try_files $uri $uri/ /index.php?$query_string,确保root指向public目录、script_filename正确、禁用fastcgi_split_path_info。

ThinkPHP在Linux服务器上部署后访问路由地址返回404,不是代码写错了,而是Nginx根本没把请求交给public/index.php处理——它在文件系统里找/user/login这个真实路径,找不到就甩个404,框架连启动的机会都没有。
确认是否真为伪静态问题
先验证是不是Nginx转发环节出错:在浏览器中访问 http://your-domain.com/index.php?s=/index/index,能正常显示页面;但访问 http://your-domain.com/index/index 就报404。这说明ThinkPHP本身运行正常,只是URL美化失效。
用curl快速复现:curl -I http://localhost/index.php 应返回200;curl -I http://localhost/index/index 若返回404,问题锁定在Nginx配置层。
注意:不要跳过这步直接改配置,很多所谓“伪静态失败”其实是APP_DEBUG关闭、url_route_on=false或runtime目录权限755导致的静默失败。
根目录部署的标准配置(推荐)
第一步:编辑站点Nginx配置文件,例如 /etc/nginx/sites-available/your-site 或宝塔面板中对应站点的配置页。
第二步:定位到 server { } 块内部,在 location ~ \.php$ 之前插入以下块:
location / {<br> try_files $uri $uri/ /index.php?$query_string;<br>}
第三步:检查PHP处理块是否含关键行——必须存在且未被注释:fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
若用 $document_root 替代 $realpath_root,需确保root指令写在server级而非location级,否则变量解析为空。
第四步:确认Nginx的 【root指令指向public目录绝对路径】,例如 root /var/www/myapp/public;。若指向项目根目录(如/var/www/myapp/),则$document_root/index.php会拼成/var/www/myapp/index.php,而该文件实际位于/var/www/myapp/public/index.php,必然触发“No input file specified”错误。
子目录部署的修正方案
方法一:用带前缀的location + rewrite(兼容性最强)
假设项目部署在 https://example.com/myapp/,入口文件物理路径为 /var/www/html/myapp/public/index.php:
在server块中添加:
location /myapp/ {<br> if (!-e $request_filename) {<br> rewrite ^/myapp/(.*)$ /myapp/index.php?s=$1 last;<br> }<br>}
注意:末尾斜杠不能省,location /myapp 不匹配 /myapp/xxx 请求,会导致PATH_INFO截断。
方法二:用try_files + alias(更安全,但需配合alias)
将location改为:
location /myapp/ {<br> alias /var/www/html/myapp/public/;<br> try_files $uri $uri/ /myapp/index.php?$query_string;<br>}
此时alias后的路径末尾必须有斜杠,且try_files中的/myapp/index.php要与URL路径前缀严格一致——少一个字符,PHP-FPM就收不到正确SCRIPT_FILENAME。
绕开PATH_INFO陷阱的终极写法
ThinkPHP 6.x 默认启用PATH_INFO模式,但Nginx处理该模式极易出错。最稳方案是让框架走QUERY_STRING模式,彻底避开fastcgi_split_path_info干扰:
第一步:在ThinkPHP项目中打开 config/app.php,确认 'url_route_on' => true,并【禁用PATH_INFO依赖】:将 'url_common_param' => false 和 'url_html_suffix' => '' 设为默认值,不强制开启pathinfo。
第二步:Nginx配置只保留最简try_files规则,删掉所有if (!-e ...)和fastcgi_split_path_info相关行——它们是90%的500和404源头。
第三步:确保PHP处理块中存在 fastcgi_param REQUEST_URI $request_uri;,否则框架从$_SERVER读到的URI是重写前的原始值,多语言前缀(如/zh-CN/user)会被丢弃。
这一步操作起来很简单,直接把旧配置里所有fastcgi_split_path_info整行删掉就行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











