thinkphp在nginx中路由失效、404或path_info丢失,根本原因是server块未适配其url解析机制;需按pathinfo模式(提取path_info)、rewrite兼容模式(透传s参数)、通用try_files模式(推荐)、静态资源与安全加固、path_info兜底补救五类方案精准配置。

如果您在Nginx上部署ThinkPHP应用时发现URL路由失效、404错误频发或PATH_INFO无法获取,则很可能是server块配置未适配ThinkPHP的URL解析机制。以下是针对该问题的多种可落地的server块配置方案:
一、PathInfo模式(URL_MODEL=1)配置
此模式要求Nginx显式提取并传递PATH_INFO变量,使ThinkPHP能正确解析如/index.php/module/controller/action形式的路径参数。核心在于重写URI并注入fastcgi_param PATH_INFO。
1、在server块中定义location ~\.php匹配动态脚本请求,并启用PATH_INFO提取逻辑。
2、使用if语句对$fastcgi_script_name进行正则匹配,将入口文件与后续路径分离。
3、通过set指令分别赋值$fastcgi_script_name_new为入口文件路径,$path_info为剩余路径部分。
4、重写SCRIPT_FILENAME和SCRIPT_NAME参数,确保FastCGI进程定位到真实index.php文件。
5、显式添加fastcgi_param PATH_INFO $path_info,使PHP中$_SERVER['PATH_INFO']可用。
6、在根location /中配置try_files或if(!-e $request_filename)重写规则,将非静态资源请求统一转发至index.php。
二、Rewrite兼容模式(URL_MODEL=3)配置
该模式将全部路由参数拼接进查询字符串,由ThinkPHP内部解析s参数,无需依赖PATH_INFO。Nginx仅需完成入口文件注入与参数透传,兼容性更强且配置更简洁。
1、在server块中保留标准的location ~\.php配置,不修改SCRIPT_NAME或PATH_INFO。
2、于location /中使用if(!-e $request_filename)判断请求资源是否存在。
3、执行rewrite指令:rewrite ^(.*)$ /index.php?s=$1 last,将完整URI作为s参数值传递。
4、确保ThinkPHP配置文件中设置URL_MODEL=>3且'VAR_PATHINFO'=>'s'。
5、确认index.php文件位于root目录下且具有可执行权限。
三、通用Try_Files模式(推荐用于新版ThinkPHP)
利用Nginx原生try_files指令替代if判断,避免潜在的性能与安全风险,同时适配现代ThinkPHP默认的URL重写需求。该方式不依赖PATH_INFO,也不强制使用s参数,结构清晰且符合Nginx最佳实践。
1、在location /中直接使用try_files $uri $uri/ /index.php?$query_string。
2、确保location ~ \.php$块中包含fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name。
3、删除所有基于if的重写逻辑,避免与try_files产生冲突。
4、在ThinkPHP配置中启用URL_MODEL=>2(REWRITE模式),并确认伪静态规则已启用。
5、验证请求如/user/profile/id/123是否被正确映射至index.php并触发路由分发。
四、静态资源分离与安全加固配置
在以上任一主模式基础上,必须补充静态资源处理与基础安全策略,防止恶意访问与性能损耗。该部分不改变路由逻辑,但直接影响服务稳定性与攻击面。
1、添加独立location块匹配常见静态后缀:location ~.*\.(gif|jpg|jpeg|png|bmp|swf|js|css|ico|woff2?)$。
2、在该location中配置expires 30d或expires max启用浏览器缓存。
3、添加location ~ /\.ht和location ~ /\.git等规则,使用deny all禁止敏感目录访问。
4、在server块顶部设置server_tokens off隐藏Nginx版本信息。
5、配置error_page 404 /404.html与error_page 500 502 503 504 /50x.html提供友好错误页。
五、PATH_INFO缺失补救配置(兜底方案)
当框架明确依赖PATH_INFO但当前Nginx版本或模块限制导致无法正常注入时,可通过fastcgi_param硬编码方式模拟该变量,适用于紧急修复场景。
1、在location ~\.php$块内添加fastcgi_param PATH_INFO $fastcgi_path_info。
2、紧接着添加fastcgi_split_path_info ^(.+?\.php)(/.*)$;启用路径拆分。
3、确保fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name指向正确物理路径。
4、验证$_SERVER['PATH_INFO']在PHP中输出是否为预期子路径(如/module/controller/action)。
5、若仍为空,检查Nginx是否编译了--with-http_realip_module且未被禁用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











