frankenphp更换域名需同步修改caddyfile的server块域名、tls配置及http→https重定向,更新框架内wp_home/app_url等常量,并确保$_server['http_host']通过header_up正确传递。

FrankenPHP 线上网站更换域名,核心要改的是 Caddyfile 路由声明、PHP 应用内硬编码的域名引用(如 WP_HOME、APP_URL)、以及 HTTPS 证书绑定,不是改 Nginx 那套虚拟主机逻辑。
Caddyfile 中必须更新 server 块的域名和 TLS 配置
FrankenPHP 的路由完全靠 Caddyfile 的 server 块匹配,换域名第一步就是改这里:
- 把原
example.com或www.example.com替换成新域名,支持多域名写法:new-site.com www.new-site.com - 如果用了 Let’s Encrypt 自动签发,旧证书不会自动迁移,需删掉
/data/caddy/certificates/下对应旧域名的目录(或清空整个certificates),否则 FrankenPHP 可能复用过期证书或拒绝申请新证 - 若手动挂载证书,要把新域名的
fullchain.pem和privkey.pem放到容器可读路径,并在 Caddyfile 中更新tls指令指向新路径,例如:tls /data/certs/new-site.com/fullchain.pem /data/certs/new-site.com/privkey.pem - 别漏掉 HTTP → HTTPS 重定向规则:确保有
redir https://{host}{uri} permanent或启用auto_https,否则用户访问 http 版本会 404
WordPress / Laravel / Symfony 等框架需同步更新应用级域名常量
FrankenPHP 不干预 PHP 应用内部逻辑,但框架生成 URL、跳转、资源链接都依赖配置项,不改就会出现混合内容(HTTP 资源被 HTTPS 页面拦截)或跳转回旧域名:
- WordPress:必须在
wp-config.php中明确定义define('WP_HOME', 'https://new-site.com');和define('WP_SITEURL', 'https://new-site.com');—— 仅靠数据库选项siteurl和home不可靠,尤其开启对象缓存时 - Laravel:修改
.env中的APP_URL=https://new-site.com,并确保config/app.php中'url'键值未被硬编码为旧地址 - Symfony:检查
.env的APP_URL,同时确认framework.trusted_hosts配置已加入新域名,否则会因 Host 头校验失败返回 400 - 所有框架:搜索项目代码中是否直接写了
http://old-site.com字符串(尤其在邮件模板、API 回调地址、JS 配置里),这类硬编码必须人工替换
注意 $_SERVER 变量变化对重定向逻辑的影响
换域名后,很多 PHP 代码会通过 $_SERVER['HTTP_HOST'] 或 $_SERVER['REQUEST_URI'] 做跳转判断,而 FrankenPHP 的 Caddy 层默认不设 X-Forwarded-Host,导致这些变量仍返回旧值或空:
- 在 Caddyfile 的对应
server块里加header_up Host {host}(用于php_server上游),确保 PHP 层拿到真实请求 Host - 如果用了反向代理(比如前置 Cloudflare),还需显式加
header_up X-Forwarded-Proto {scheme}和header_up X-Forwarded-Host {host},否则request()->secure()或is_ssl()可能误判 - 测试手段:在站点根目录放一个
debug.php,内容为var_dump($_SERVER['HTTP_HOST'], $_SERVER['HTTPS'], $_SERVER['REQUEST_SCHEME']);,访问确认输出符合预期
静态资源与 API 路径别被重写规则“错绑”
多项目共存或前后端分离部署时,Caddyfile 的 handle 和 php_server 作用域容易因域名变更而错位:
- 检查是否误把新域名的
server块写进了旧项目的配置块里,导致 root 指向错误目录(常见于 copy-paste 后没改root路径) - 前后端分离项目(如 Vue + Symfony API),确认
handle /api/*这类路径规则仍在新域名块内,而不是挂在旧域名块下被忽略 - ThinkPHP 或 CodeIgniter 类框架依赖 PATH_INFO,要验证
cgi.fix_pathinfo=1仍在生效(可通过phpinfo()查看),否则/index.php/admin/user会 404 - 上线前用
curl -I https://new-site.com/favicon.ico和curl -I https://new-site.com/api/test分别测静态文件和接口响应头,确认状态码和 Content-Type 正确
最易忽略的是 Caddy 的证书缓存和 $_SERVER 的 Host 来源——它不从 DNS 或浏览器地址栏读,只从请求头或 Caddy 配置来;一旦这两处没对齐,前端看着是新域名,后端生成的链接却还是旧的,排查起来极难定位。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











