thinkphp5在linux+nginx下404的根本原因是请求未路由至index.php,需配置伪静态规则兜底转发;关键包括开启cgi.fix_pathinfo、root指向public目录、php块中设置fastcgi_split_path_info与path_info参数,并推荐使用if+rewrite或try_files方案。

ThinkPHP5 在 Linux + Nginx 环境下出现 404 或无法访问路由,根本原因不是框架写错了,而是请求没进到 index.php 入口——Nginx 默认只处理真实文件和目录,对 ThinkPHP 的路径式 URL(如 /index/index)直接返回 404。必须靠伪静态规则把非静态请求“兜底”转发给入口文件。
确认基础环境是否就绪
伪静态生效的前提是底层支持到位:
-
PHP 配置开启 pathinfo:编辑
/etc/php/*/fpm/php.ini(或对应版本路径),确保cgi.fix_pathinfo = 1,改完重启 php-fpm -
Nginx 运行目录指向 public:root 必须设为项目
public/目录,不是根目录。例如:root /var/www/myapp/public; -
PHP 处理块含 PATH_INFO 支持:在
location ~ \.php$块中,必须有这两行:fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;<br>fastcgi_param PATH_INFO $fastcgi_path_info;
推荐配置:if + rewrite(宝塔/通用 Linux 环境最稳)
这是兼容性最强、实测落地率最高的方案,尤其适合宝塔面板或旧版 Nginx:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 在站点的
server块内、location ~ \.php$之前添加:location / {<br> if (!-e $request_filename) {<br> rewrite ^(.*)$ /index.php?s=$1 last;<br> }<br>} - 注意:
last不可换成break或redirect,否则重写后不重新匹配 location,请求会卡死 - 保存后执行
nginx -t && systemctl reload nginx,验证语法并重载
进阶配置:try_files(更符合 Nginx 规范)
若你手动维护配置且 Nginx 版本 ≥ 1.9.1,可用更优雅的写法:
- 替换上面的
location /块为:location / {<br> try_files $uri $uri/ /index.php?$query_string;<br>} - 同时确保 PHP 处理块中包含关键参数:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;(用$realpath_root而非$document_root,避免软链接路径问题) - 该方式不依赖 if 判断,性能略优,但部分低版本 Nginx 或宝塔插件可能对其 fallback 行为识别不准
验证与排错要点
配完不生效?按顺序检查这几项:
- 访问
http://your-domain.com/index.php/index/index能打开 → 说明 PHP 和框架本身没问题 - 访问
http://your-domain.com/index/index报 404 → 伪静态规则未生效或未加载 - 访问报 500 或白屏 → 检查
fastcgi_param PATH_INFO是否缺失,或php.ini中禁用了putenv/ini_set(TP5 依赖它们) - 子目录部署(如
example.com/app/)需额外加前缀:rewrite ^/app/(.*)$ /app/index.php?s=$1 last;,且location要写成location /app/ { ... }
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










