frankenphp回源时host头必须由cdn正确透传,否则会导致server块匹配错误、404/502或wordpress后台白屏;需在cdn配置中明确设置回源host为真实域名并启用“透传客户端host”选项。

FrankenPHP回源时Host头必须透传
FrankenPHP本身不处理CDN回源逻辑,它只负责接收来自CDN的请求并执行PHP。如果CDN回源时没带正确的Host头,或用了默认IP回源,Nginx/Caddy前置层(哪怕只是做TLS终止)可能把请求转给错误的server块,导致404或502。尤其当你的站点绑定了多个域名、或用子域名区分环境(如admin.example.com vs www.example.com)时,这个问题会直接让WordPress后台白屏。
实操建议:
- 在CDN控制台「回源配置」中,明确设置
回源Host为源站真实域名(如www.example.com),不要留空或填IP - 启用「透传客户端Host头」选项(阿里云叫“跟随客户端Host”,Cloudflare叫“Preserve original Host”)
- 如果FrankenPHP跑在Caddy下,确认Caddyfile里
reverse_proxy或php指令没有覆盖Host头;若用了header_up Host {http.request.host}之类手动设置,要删掉
动态请求路径必须绕过CDN缓存
FrankenPHP的优势是常驻进程+低延迟执行PHP,但CDN一旦缓存了/wp-admin/、/wp-login.php、/wp-json/或AJAX接口(如/wp-admin/admin-ajax.php),用户看到的就是过期HTML或登录态错乱——比如A用户登录后CDN缓存了带“已登录”字样的页面,B用户刷新就直接看到A的头像。
实操建议:
- 在CDN缓存规则中,将以下路径设为
不缓存(优先级最高,放第一条):/wp-admin/、/wp-login.php、/wp-json/、/wp-admin/admin-ajax.php、/wp-content/plugins/*(插件含大量动态逻辑) - 检查WordPress是否启用了对象缓存(如Redis),避免CDN不缓存但PHP仍从旧缓存读数据
- 验证方式:用
curl -I https://cdn.example.com/wp-admin/看响应头是否有Cache-Control: no-cache或X-Cache: BYPASS
HTTPS协议和X-Forwarded-Proto头要对齐
FrankenPHP内部依赖$_SERVER['HTTPS']和$_SERVER['HTTP_X_FORWARDED_PROTO']判断当前连接是否安全。如果CDN回源用HTTP但前端是HTTPS,WordPress会生成混合内容(HTTP资源被浏览器拦截)、重定向死循环,甚至WP REST API返回http://链接导致前端JS调用失败。
将 LaTeX(.tex)学术论文转换为 Word(.docx),支持可编辑的 OMML 公式、原生 Word 表格、嵌入图形、IEEE 双栏排版及参考文献
实操建议:
- CDN回源协议必须设为
HTTPS(即使源站FrankenPHP监听HTTP,也要在Caddy/Nginx层做TLS终止并透传X-Forwarded-Proto: https) - 在FrankenPHP启动前,确保环境变量
TRUSTED_PROXIES包含CDN所有出口IP段(如Cloudflare的173.245.48.0/20),否则X-Forwarded-*头会被忽略 - WordPress中强制HTTPS:在
wp-config.php加define('FORCE_SSL_ADMIN', true);和if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') $_SERVER['HTTPS'] = 'on';
静态资源域名分离后CDN缓存头不能被FrankenPHP覆盖
FrankenPHP默认对所有PHP响应输出Cache-Control: no-cache, must-revalidate,这是安全默认值。但如果静态资源(如/wp-content/themes/mytheme/style.css)走的是CDN独立域名(如static.example.com),而这个域名又指向FrankenPHP服务,CSS/JS就会被强制不缓存——CDN每次都要回源,失去加速意义。
实操建议:
- 静态资源必须用独立子域名接入CDN,并在CDN侧配置针对
*.css、*.js等后缀的缓存规则(如max-age=31536000) - FrankenPHP不处理这些静态请求:要么用Caddy的
file_server直接托管,要么在Nginx层用location ~* \.(css|js|png|jpg)$拦截并返回静态文件,完全绕过PHP - 验证关键点:访问
https://static.example.com/style.css,响应头里不能有Cache-Control: no-cache,且要有X-Cache: HIT
FrankenPHP和CDN协作的关键不在FrankenPHP本身,而在于CDN能否把“该缓存的”和“该直通的”严格区分开——漏掉任何一个动态路径的绕过规则,或者多写了一条静态资源的no-cache,都可能让整个加速链路失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










