将子域名部署的WordPress博客通过主站子目录/blog访问并修正内部链接问题求助
我的场景和当前问题
我主站用Next.js搭建,部署在https://mysite.com;博客是WordPress,部署在子域名https://blog.mysite.com,两者用的是完全不同的服务器和托管平台。
我想让博客能通过主站的子目录https://mysite.com/blog访问,已经在Next.js里配置了rewrites规则,现在能打开博客首页,但博客里的内部链接、页面、文章、媒体资源依然指向原来的子域名,点击后会跳去https://blog.mysite.com,没办法在主站子目录下正常浏览。
我目前用的Next.js重写规则代码如下:
async rewrites() { return [ { source: '/blog', destination: 'https://blog.mysite.com/', }, { source: '/blog/:slug', destination: 'https://blog.mysite.com/:slug', // Matched parameters can be used in the destination }, ] },
我试过一些关于反向代理配置WordPress的方案,但调整后都把WordPress的配置搞坏了,现在卡在这,求大家帮忙解决。
整理的解决方案
别着急,这种反向代理下的WordPress内部链接跑偏问题很常见,核心就是要让WordPress“意识到”自己现在是通过主站的/blog子目录对外服务,而不是原来的子域名。下面是一步步的靠谱解决方法:
1. 修改WordPress核心站点设置
暂时还是通过子域名https://blog.mysite.com/wp-admin登录WordPress后台:
- 进入「设置」→「常规」页面
- 把「WordPress地址(URL)」和「站点地址(URL)」都改成
https://mysite.com/blog - 点击保存设置,这时候后台可能会自动跳转到新的
/blog/wp-admin地址,正常登录就行
2. 批量替换数据库里的旧链接
改完设置后,旧文章、旧页面里的图片、手动添加的链接可能还是指向子域名,这时候需要批量替换数据库内容:
- 重要:先备份你的WordPress数据库,避免出错!
- 用数据库管理工具(比如phpMyAdmin)打开WordPress的数据库
- 执行以下SQL语句,把所有子域名链接替换成主站子目录链接:
UPDATE wp_posts SET post_content = REPLACE(post_content, 'https://blog.mysite.com', 'https://mysite.com/blog'); UPDATE wp_postmeta SET meta_value = REPLACE(meta_value, 'https://blog.mysite.com', 'https://mysite.com/blog');
提示:如果你的数据库前缀不是默认的wp_,要改成你自己的前缀哦
3. 优化Next.js的rewrites规则
原来的规则只覆盖了/blog和/blog/:slug,像/wp-content/下的图片、样式这类静态资源可能没被代理,建议把规则改成更全面的版本:
async rewrites() { return [ { source: '/blog/:path*', destination: 'https://blog.mysite.com/:path*', }, ] },
这样所有/blog/开头的请求都会被转发到子域名的对应路径,包括各种静态资源,不会出现样式或图片加载失败的情况。
4. 配置WordPress的反向代理兼容
有时候WordPress会因为反向代理的头部信息不对,自动跳回子域名,这时候需要在WordPress根目录的wp-config.php文件里添加以下代码:
define('FORCE_SSL_ADMIN', true); if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; } define('WP_HOME', 'https://mysite.com/blog'); define('WP_SITEURL', 'https://mysite.com/blog');
这段代码能让WordPress正确识别反向代理过来的HTTPS请求,并且强制使用新的站点URL,避免跳转回子域名。
5. 清除所有缓存
最后一步别忘:
- 清除WordPress的缓存(如果用了缓存插件,比如WP Rocket、W3 Total Cache)
- 重新构建Next.js项目,清除生产环境的缓存
- 自己浏览器也清一下缓存,然后测试所有链接和资源
踩坑提醒
- 改数据库之前一定要备份!万一替换错了字段,还能恢复
- 如果改完站点设置后登录不了后台,直接修改
wp-config.php里的WP_HOME和WP_SITEURL也能生效 - 测试的时候要多点点内部链接、图片、分页,确保所有内容都在
/blog子目录下正常加载
备注:内容来源于stack exchange,提问作者kunal saxena

