本文约 3,370 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:改了一个框,全站打不开
设置 → 常规里有两个看起来几乎一样的输入框:
- WordPress 地址(URL):
siteurl - 站点地址(URL):
home
很多人以为”两个填一样就行”,于是换域名时两个都改了,或者只改了一个,然后发现:前台能开后台跳转死循环,或者后台能开前台全 404,或者干脆两边都打不开。
这个操作没有”确认”二次提示,一点保存就立刻生效,是全 WordPress 最容易一键搞挂站点的设置项之一。
原理分析:两个字段各管什么
记住一句话就够:
siteurl(WordPress 地址) = WordPress 核心文件所在目录的 URL。它决定后台管理面板、wp-admin、wp-includes、脚本资源从哪加载。home(站点地址) = 访客访问的首页 URL。它决定前台所有链接、canonical、RSS、sitemap 的域名。
两者默认相同。它们不同的典型场景只有两种:
- WordPress 装在子目录,但希望访客从根目录访问(官方叫 “Giving WordPress Its Own Directory”)。比如核心在
/wp/,siteurl = https://example.com/wp,home = https://example.com。 - 前后端分离 / 管理后台独立域名。
home指向前端站点,siteurl指向后台所在域名。
除了这两种,绝大多数站点两个必须填一样。填不一样的后果是:后台登录跳转时会从 siteurl 跳到 home,跨域跳转把登录 cookie 丢了,于是无限重定向回登录页——这就是”登录循环”最常见的成因之一。
这两个值都存在 wp_options 表:
SELECT option_name, option_value
FROM wp_options
WHERE option_name IN ('siteurl','home');
保姆级实操
场景一:正常更换域名(后台还能进)
直接改 设置 → 常规 里的两个框 → 保存。但只改这两个还不够,数据库里还有大量旧域名的绝对 URL:文章正文里的图片、Gutenberg 的区块属性、主题的 options、菜单里的自定义链接。
必须再跑一次全库替换(Gutenberg 会把 URL 存进序列化 JSON,手工改必坏):
wp search-replace 'https://old.com' 'https://new.com' --all-tables --precise --skip-columns=guid
--precise 强制走 PHP 序列化安全替换;--skip-columns=guid 保护 RSS 的全局 ID。
改完清缓存并刷新重写规则:
wp rewrite flush
wp cache flush
场景二:已经进不去后台了(三种自救)
方法 A:改 wp-config.php(最快,推荐)
在 wp-config.php 里 /* That's all */ 之前加:
define( 'WP_HOME', 'https://new.com' );
define( 'WP_SITEURL', 'https://new.com' );
这两个常量会覆盖数据库里的值,网站立刻恢复可访问。之后去后台设置页确认(此时设置页的两个框会变灰不可编辑,这是正常现象)。
用完如果想让后台可编辑,把这两行注释掉即可恢复数据库控制。
方法 B:改数据库
UPDATE wp_options SET option_value = 'https://new.com'
WHERE option_name IN ('siteurl','home');
注意表前缀,多站点是 wp_2_options。
方法 C:用 WP-CLI(需要 SSH)
wp option update home 'https://new.com'
wp option update siteurl 'https://new.com'
wp option get home
场景三:WordPress 装子目录,前台用根目录
- 后台 设置 → 常规:WordPress 地址填
https://example.com/wp,站点地址填https://example.com。 - 把根目录下
index.php改一行:
require( __DIR__ . '/wp/wp-blog-header.php' );
- 把
wp/里的.htaccess复制到根目录(Apache),Nginx 无需此步。 - 保存固定链接设置刷新规则。
场景四:HTTP 改 HTTPS 后地址没跟着变
只装了 SSL 证书但后台地址还是 http://,会导致浏览器拦混合内容、后台样式加载失败:
wp search-replace 'http://example.com' 'https://example.com' --all-tables --precise
wp option update home 'https://example.com'
wp option update siteurl 'https://example.com'
再在 wp-config.php 里强制后台走 HTTPS:
define( 'FORCE_SSL_ADMIN', true );
如果在反向代理/CDN 后面,还要补上:
if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'] ) {
$_SERVER['HTTPS'] = 'on';
}
否则 WordPress 会误判协议,产生无限跳转。
常见踩坑与失败案例
- 案例一:换域名只改了设置页两个框,没跑
search-replace,前台文章里的图片全是旧域名 404。后台编辑文章时图片还能显示(因为用的是相对缓存),前台全裂,非常隐蔽。 - 案例二:把
siteurl改成了带/index.php或末尾多了/的地址,后台资源 404,登录页只剩裸 HTML。要保持格式干净:https://example.com,不带尾斜杠。 wp-config.php常量”改不了”:加了WP_HOME后后台设置页变灰,很多人以为坏了。这是 WordPress 的预期行为,删掉常量就能编辑。- 反向代理 + 强制 HTTPS 导致登录循环:尤其是套了 Cloudflare 但 SSL 模式设成 “Flexible” 的情况,源站看到的是 HTTP,WordPress 强制跳 HTTPS,Cloudflare 又用 HTTP 回源,两头互相跳。解决:Cloudflare SSL 模式改成 “Full (strict)”,源站装真实证书。
- 多站点:
home/siteurl在wp_options(主站)和wp_2_options(子站)各有一份,还有wp_blogs表的domain字段和wp_site表。改域名要三处一起改,只改一处子站全部 404。 - 改完 sitemap 报错:Yoast/RankMath 的 sitemap 用了缓存的
home值,跑一次wp cache flush并重新保存固定链接。
总结
一句话区分:siteurl 管后台和核心文件路径,home 管前台访客看到的地址,除子目录安装外两者必须一致。换域名的标准动作是”改两个 option + 全库 search-replace + rewrite flush“。万一改错了进不去后台,最快的自救是往 wp-config.php 里塞 WP_HOME/WP_SITEURL 两个常量——它优先级高于数据库,能立刻把站点救回来。另外换域名后别忘了去百度站长平台和 Google Search Console 提交改版规则,否则收录会有一段空窗期。
