云原生环境下ThinkPHP伪静态需手动补全PATH_INFO:在public/index.php中从REQUEST_URI剥离/index.php赋值给$_SERVER['PATH_INFO'],并配置url_model=>2和pathinfo_fetch=>['SERVER_REQUEST_URI']。

云原生环境(如 GCP Cloud Run、Kubernetes Ingress、阿里云 ACK)下,ThinkPHP 伪静态规则不能直接套用传统服务器配置——try_files 或 rewrite 规则本身可能被容器网络层拦截或忽略,真正卡住的往往是 PATH_INFO 传递和反向代理头处理。
Cloud Run / Serverless 环境下伪静态根本不可用?
Cloud Run 不允许运行时修改 Nginx/Apache 配置,也不支持 mod_rewrite 或 location 块。所谓“伪静态”在这里是个伪命题:你无法在容器内写 try_files,也不能靠 if (!-e $request_filename) 拦截请求。
- 唯一可行路径是把所有非静态资源请求(即不匹配
.js、.css、.png等后缀)统一路由到/index.php入口,由 ThinkPHP 自身解析 - 必须在
public/index.php开头手动补全$_SERVER['PATH_INFO']:比如从$_SERVER['REQUEST_URI']中剥离/index.php后的部分,并赋值给$_SERVER['PATH_INFO'] - 同时设置
'url_model' => 2和'pathinfo_fetch' => ['SERVER_REQUEST_URI'],让框架跳过依赖 PHP-FPM 的 PATH_INFO 自动提取逻辑
Nginx Ingress 或 Traefik 下 PATH_INFO 总是为空
Ingress controller 默认不会把原始路径透传为 PATH_INFO,它只转发 QUERY_STRING 和 SCRIPT_NAME,而 ThinkPHP 5/6 在默认模式下只认 PATH_INFO。
- 在 Ingress 配置中显式添加注解(如 Nginx Ingress 的
nginx.ingress.kubernetes.io/configuration-snippet),注入fastcgi_param PATH_INFO $uri;(注意不是$path_info,因为 Ingress 不执行set逻辑) - 若用 Traefik,需在中间件中通过
replacePathRegex提取路径并注入 header,再在 PHP 入口里读取该 header 赋值给$_SERVER['PATH_INFO'] - 避免依赖
fastcgi_param SCRIPT_FILENAME的自动拼接——Ingress 下$document_root往往是空的,必须硬编码为/var/www/html/public/index.php
宝塔 / ECS / CVM 上伪静态 404 的真实原因
不是规则没生效,而是 fastcgi_param PATH_INFO 这一行根本没进 PHP-FPM 环境——Nginx 配置里漏了 set $path_info 解析逻辑,或 location ~ \.php$ 块没覆盖到你的入口路径。
立即学习“PHP免费学习笔记(深入)”;
- 检查
location ~ \.php$是否匹配/index.php(而不是/public/index.php),否则重写后的请求压根进不了 PHP 处理块 - 确认
fastcgi_param PATH_INFO后面的变量名和set定义一致:常见错误是写了set $path_info $2,但fastcgi_param PATH_INFO $real_path_info—— 变量名对不上就等于没传 - 用
phpinfo()页面搜索PATH_INFO,看它是否显示你期望的路径(如/index/index),而不是空或/index.php
最易被忽略的点:云原生环境下,$_SERVER['REQUEST_URI'] 可能带查询参数(如 ?page=2),但 PATH_INFO 只应包含路径部分;如果手动拼错,会导致路由解析失败且无报错,只能返回首页或 404。



















