伪静态在docker中失效主因是nginx或apache容器未正确配置path_info与script_filename,而非thinkphp问题;需确保fastcgi_split_path_info正则匹配.php后路径、fastcgi_param path_info $fastcgi_path_info存在、root指向public目录、try_files规则完整且不混用if语句。

伪静态在 Docker 里失效,90% 是 Nginx 或 Apache 容器没配对 PATH_INFO 和 SCRIPT_FILENAME,不是 ThinkPHP 的锅。
为什么 /index/index 404,但 /index.php/index/index 能访问
这是典型的 PATH_INFO 解析失败信号。Nginx 默认不拆解 index.php/xxx 后半段,PHP-FPM 拿不到 $_SERVER['PATH_INFO'],ThinkPHP 就无法匹配路由。
-
fastcgi_split_path_info必须开启,且正则要匹配到.php后的路径部分,例如^(.+\.php)(/.+)$ -
fastcgi_param PATH_INFO $fastcgi_path_info这行不能漏,否则PATH_INFO始终为空 -
root必须指向public/目录(如/var/www/html/public),而不是项目根目录;否则SCRIPT_FILENAME会错指向根目录下的index.php - 如果用了
pathinfo_depr配置(比如设成-),重写规则里的分隔符也得同步改,不然index.php/user-login会被解析成错误控制器
Nginx 容器里 location / 怎么写才不 404
别抄 Apache 的 .htaccess,Nginx 根本不读它。所有逻辑必须写进 server 块,且 try_files 是唯一推荐方式。
-
location /块里用try_files $uri $uri/ /index.php?$query_string;——$query_string保证?s=api/user这类参数不丢失 - 不要用
if (!-e $request_filename),Nginx 官方明确不推荐,容易误匹配静态资源 -
location ~ \.php$必须单独定义,且fastcgi_pass要用服务名(如php:9000),不能写127.0.0.1:9000(Docker 网络不通) -
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;这行必须存在,且$document_root要和root一致,否则入口文件路径错乱
Apache 容器怎么让 .htaccess 生效
Docker 官方 httpd 镜像默认禁用 mod_rewrite 且 AllowOverride None,.htaccess 直接被忽略。
- 构建镜像时加
RUN a2enmod rewrite,否则模块根本没加载 - 覆盖默认
<directory></directory>配置,把AllowOverride None改成AllowOverride All或至少AllowOverride FileInfo -
.htaccess必须放在容器内public/目录下(即 Web 根目录),权限设为644 - 若项目部署在子目录(如
/myapp/),.htaccess里必须加RewriteBase /myapp/,否则重写目标路径偏移
Docker 挂载和目录结构最容易踩的坑
挂载错一层目录,整个伪静态就崩了——Web 服务器暴露敏感目录、静态资源 404、__ROOT__ 路径错乱全由此起。
- 只挂载
public/到/var/www/html,别挂整个项目根目录;否则app/、runtime/全被公网可访问 -
.env文件必须放在项目根目录(容器内如/var/www/.env),不能只挂载public;否则框架读不到环境变量 -
runtime/目录要单独挂载,并确保容器内 PHP 进程用户(如www-data)有写权限,否则缓存写入失败静默报错 - 多容器场景下,
runtime不能共用,不同实例的缓存、日志、进程文件会互相污染
最常被忽略的是 fastcgi_split_path_info 和 root 指向的组合:缺一不可,错一个就全挂。调试时先 docker exec -it nginx-container cat /etc/nginx/conf.d/default.conf 确认配置已生效,再 curl -I http://localhost/index/index 看响应头,比猜快得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











