frankenphp部署wordpress必须显式声明入口、配置重写、安装必要扩展并严格对齐https域名,否则将出现后台302循环、静态资源404和ajax失败;需设frankenphp_worker_entrypoint=index.php、在caddyfile中添加rewrite规则、启用cgi.fix_pathinfo=1、安装opcache/mysqli/zip等扩展,并在wp-config.php中明确定义wp_home和wp_siteurl。

FrankenPHP 部署 WordPress 不需要 Nginx 或 Apache,但必须显式声明入口、启用重写、补全 PHP 扩展,且不能跳过 HTTPS 对齐配置——否则后台 302 循环、静态资源 404、AJAX 失败这三类问题会立刻出现。
必须设置 FRANKENPHP_WORKER_ENTRYPOINT=index.php
FrankenPHP 默认不把 index.php 当作入口,WordPress 的所有请求(包括后台、REST API、固定链接)都会直接 404。这不是路径问题,是运行模式识别失败。
- 在
docker-compose.yml的服务环境变量中加:FRANKENPHP_WORKER_ENTRYPOINT=index.php - 或改用
entrypoint:entrypoint: ["frankenphp", "worker", "index.php"] - 确保
index.php真实存在于 Web 根目录(如/var/www/html/),且容器内可读(权限 644,非 600) - 别用
php-server模式——它只适合单文件脚本,对 WordPress 的多路由结构支持极差
重写规则必须写进 Caddyfile,且依赖 cgi.fix_pathinfo=1
WordPress 固定链接(比如 /2024/my-post/)靠 PATH_INFO 解析,而 FrankenPHP 的 Caddy 引擎默认不自动 fallback 到 index.php,必须手动配 rewrite。
- Caddyfile 片段示例(放在域名块内):
rewrite * { to {path} {path}/ /index.php?{query} } - 同时确认 PHP 配置中
cgi.fix_pathinfo=1已生效(在php.ini或通过php -i | grep fix_pathinfo验证) - 如果用的是官方
dunglas/frankenphp镜像,cgi.fix_pathinfo默认是 1,但某些自定义构建镜像可能关掉了,务必检查 - 开发阶段建议临时设
opcache.validate_timestamps=1,否则改了重写规则也不生效——OPcache 缓存了旧的路由逻辑
必须手动安装并重启才能启用 opcache、mysqli、zip
FrankenPHP 的 PHP 是静态编译的,php.ini 开关无效,扩展必须用 install-php-extensions 脚本安装,且装完不重启等于白装。
- 进入容器执行:
install-php-extensions opcache mysqli zip gd curl mbstring xml simplexml json - 装完立刻
docker restart <container_name></container_name>,否则phpinfo()里opcache仍显示 disabled -
mysqli和pdo_mysql二选一即可,但必须有其一;zip是插件上传解压所必需,漏掉会导致“安装失败”提示但无日志报错 - 如果用 SQLite 插件或缓存组件(如 LiteSpeed Cache),还得额外装
pdo_sqlite,否则它们会静默退化到低效的文件缓存
WP_HOME 和 WP_SITEURL 必须与 Caddyfile 域名完全一致
FrankenPHP 终止 HTTPS 后,$_SERVER['HTTPS'] 自动设为 on,但 WordPress 仍需明确知道自己跑在哪个 HTTPS 地址上——否则 wp-admin 重定向、资源 URL、Cookie 安全标志全乱。
- 编辑
wp-config.php,在/* That's all, stop editing! */上方加:define('WP_HOME', 'https://yourdomain.com');define('WP_SITEURL', 'https://yourdomain.com'); - 域名必须和 Caddyfile 中 TLS 块写的完全一致:如果 Caddyfile 写的是
https://www.yourdomain.com,这里就不能写https://yourdomain.com - 不要装
Really Simple SSL这类插件——FrankenPHP 已通过 Caddy 的redir和php_server指令完成 HTTP→HTTPS 跳转和协议头注入,插件反而会干扰重定向链路 - 检查浏览器控制台是否报混合内容(Mixed Content):若有,说明某处硬编码了
http://链接,得进数据库查wp_options表里的siteurl和home字段
最易被忽略的点是:Caddy 的 ACME 证书申请必须走 80 端口做 HTTP-01 挑战,而很多云厂商轻量服务器默认只放行 443,结果 FrankenPHP 静默回退到自签名证书——访问时提示“不安全”,但日志里几乎不报错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











