frankenphp运行wordpress多站点需配置frankenphp.yaml通配server_name、透传http_host、禁用.htaccess,并正确设置wp-config.php中subdomain_install和domain_current_site为true及纯域名;dns泛解析或hosts必须提前生效。

FrankenPHP不支持传统Apache/Nginx的Rewrite规则,必须用frankenphp.yaml重写路由
FrankenPHP本质是SAPI层运行PHP的HTTP服务器,没有.htaccess解析能力,也不走mod_rewrite或nginx rewrite。WordPress多站点子域名模式依赖动态路径分发(如site1.example.com/wp-admin/ → 主程序处理),但默认FrankenPHP只把请求转发给index.php,不会自动识别子域名并注入HTTP_HOST上下文。你看到子站后台白屏、静态资源404、或跳转到主站,基本都卡在这一步。
解决方式是显式在frankenphp.yaml中声明子域名匹配逻辑,并确保HTTP_HOST透传给PHP:
- 确认
frankenphp.yaml位于项目根目录(与wp-config.php同级) - 添加
server_name通配规则,例如:server_name: "*.example.com example.com" - 在
routes下配置path为/,并设置script: index.php,同时启用pass_host_header: true - 务必删掉所有
.htaccess文件——它在FrankenPHP里完全无效,留着反而干扰调试
wp-config.php里SUBDOMAIN_INSTALL必须设为true,且DOMAIN_CURRENT_SITE不能带www
子域名模式下,WordPress靠$_SERVER['HTTP_HOST']判断当前站点。如果DOMAIN_CURRENT_SITE写成www.example.com,而用户访问的是site1.example.com,WP会认为这不是网络内合法域名,直接拒接路由,导致前台空白或重定向循环。
正确写法(放在define('WP_ALLOW_MULTISITE', true);之后):
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true);
define('DOMAIN_CURRENT_SITE', 'example.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
注意点:
- 不要加
www、http://或尾部/,纯域名字符串 - 如果DNS还没生效,本地测试时改
/etc/hosts:一行写全所有子域,例如127.0.0.1 example.com site1.example.com site2.example.com -
PATH_CURRENT_SITE必须是'/',子域名模式下不允许设为'/subdir/'
DNS泛解析和本地hosts必须提前配好,否则wp-admin进不去
FrankenPHP本身不处理DNS,它只响应已到达的HTTP请求。如果你没配泛解析(*.example.com → A记录指向服务器IP),或者本地/etc/hosts漏了某个子域名,浏览器根本发不出请求,自然卡在“无法连接”或“ERR_NAME_NOT_RESOLVED”。这时候检查WordPress日志或FrankenPHP控制台毫无意义——流量压根没进来。
将 LaTeX(.tex)学术论文转换为 Word(.docx),支持可编辑的 OMML 公式、原生 Word 表格、嵌入图形、IEEE 双栏排版及参考文献
验证是否就绪:
- 执行
ping site1.example.com,确认返回127.0.0.1(本地)或你的服务器IP(线上) - 用
curl -H "Host: site1.example.com" http://127.0.0.1手动模拟请求,看是否返回子站首页HTML(不是主站) - 如果返回404或主站内容,说明FrankenPHP路由未生效,回头检查
frankenphp.yaml中的server_name和pass_host_header
子站固定链接失效?别碰permalink_structure,用MU插件强制继承
新创建的子站默认固定链接是?p=123,即使你在主站设了/%postname%/,子站也不会自动同步。这不是FrankenPHP特有,而是WP多站点设计如此——每个站点的permalink_structure是独立选项,新建时取空值。
手动进每个子站后台改太麻烦,也容易漏。更稳的方式是放一个MU插件:
在wp-content/mu-plugins/inherit-permalink.php里写:
<?php add_action('wpmu_new_blog', function ($blog_id, $user_id, $domain, $path, $site_id, $meta) {
$main_structure = get_blog_option(1, 'permalink_structure');
update_blog_option($blog_id, 'permalink_structure', $main_structure);
switch_to_blog($blog_id);
global $wp_rewrite;
$wp_rewrite->init();
$wp_rewrite->flush_rules();
restore_current_blog();
}, 10, 6);
关键点:
- 必须放在
mu-plugins目录,普通插件目录无效 -
$wp_rewrite->flush_rules()不能省——否则重写规则不生效,前台仍404 - FrankenPHP下
flush_rules()不会写.htaccess,它只更新数据库里的rewrite_rules,所以完全兼容
HTTP_HOST能正确传入、server_name匹配上、DNS解析到位,剩下的就是标准WP多站点流程——不需要额外适配。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










