问题现象
ThinkPHP框架在Nginx服务器上部署时,常出现路由失效、访问任何非首页URL返回404错误。根本原因是Nginx默认不支持PATH_INFO模式,且重写规则配置不准确。
解决方案
1. 确认PHP运行模式
确保PHP以php-fpm方式运行,并支持PATH_INFO。在php.ini中设置cgi.fix_pathinfo=1。
2. 配置Nginx伪静态规则
在Nginx的server配置块中添加如下规则:
location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } }
该规则将不存在的文件请求重写到index.php,并传递原始URL的路径参数。
3. 处理PATH_INFO支持
若上述规则仍失效,需进一步配置PATH_INFO传递:
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_param PATH_INFO $fastcgi_path_info; }
同时,在server块中加入:
set $fastcgi_path_info ''; if ($fastcgi_script_name ~ "^(.+\.php)(/.+)$") { set $fastcgi_path_info $2; }
4. 验证与测试
重启Nginx和PHP-FPM,访问任意路由如/index/user/login,应能正常显示。若仍有问题,检查URL_MODEL配置:'URL_MODEL'=>1(PATHINFO模式)。
注意事项
- 确保Nginx配置中try_files指令未被错误覆盖。
- 不同ThinkPHP版本可能有细微差异,建议参考官方文档。
- 若使用HTTPS,需在重写规则中保持协议一致。