15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
21.10.2024

WordPress地址与站点地址:技术差异、配置及常见问题

WordPress Address(URL)和 Site Address(URL)是两个不同的配置参数,分别控制 WordPress 核心文件在服务器上的存储位置,以及公众用于访问网站前端的 URL。在大多数标准安装中,这两个值是相同的,但当您将 WordPress 文件托管在子目录中同时从根域名提供网站服务时,它们可以——有时必须——有所不同。

这两个值哪怕只有一个字符出错,都可能导致您无法访问管理后台、触发混合内容警告、破坏 REST API 端点,并损坏重定向链。以下各节将解释每个设置背后的架构逻辑、所有合理的更改场景,以及安全操作的具体方法。

两个 URL 参数背后的架构逻辑

WordPress 同时在两个地方存储其 URL 配置:wp_options 数据库表(行 siteurlhome)以及可选的通过 PHP 常量定义的 wp-config.php 文件。在修改任何内容之前,了解哪个来源具有优先权至关重要。

优先级顺序(从高到低):

  1. wp-config.php 中定义的常量(WP_SITEURLWP_HOME
  2. 存储在 wp_options 表中的值
  3. 在后台 Settings > General 中输入的值

当在 wp-config.php 中定义了常量时,Settings > General 中对应的字段将变为只读并显示为灰色。这是有意为之的——它可以防止通过 UI 意外覆盖,同时仍允许以编程方式进行控制。

WordPress Address(URL)— WP_SITEURL

WordPress Address 对应 wp_options 中的 siteurl 选项以及 wp-config.php 中的 WP_SITEURL 常量。它告诉 WordPress 其核心 PHP 文件、wp-admin 目录和 wp-includes 目录的实际存储位置。WordPress 使用此值构建每个内部文件路径引用,包括管理员登录 URL、AJAX 端点(/wp-admin/admin-ajax.php)和 REST API 基础路径(/wp-json/)。

示例:如果您的 WordPress 安装位于 https://example.com/wordpress,则 WP_SITEURL 必须为 https://example.com/wordpress。访问 https://example.com/wordpress/wp-admin 将进入管理后台。

Site Address(URL)— WP_HOME

Site Address 对应 wp_options 中的 home 选项以及 wp-config.php 中的 WP_HOME 常量。它定义了规范的公共 URL——用户在浏览器中输入的地址,也是 WordPress 生成所有前端固定链接结构的基础。

示例:即使核心文件位于 https://example.com/wordpress,您也可以将 WP_HOME 设置为 https://example.com,以便从根域名提供主页、文章和页面。这需要在根目录放置一个额外的 index.php 文件和 .htaccess 规则(详见下文)。

对比:WordPress Address 与 Site Address

属性WordPress Address(`WP_SITEURL`)Site Address(`WP_HOME`)
`wp_options` 行`siteurl``home`
`wp-config.php` 常量`WP_SITEURL``WP_HOME`
控制内容核心文件位置、`wp-admin`、`wp-includes`面向公众的规范 URL
影响管理员登录 URL
影响前端固定链接
影响 REST API 基础路径
影响站点地图和规范标签间接影响直接影响
可与另一个值不同
不同时需要更改 `.htaccess`

这两个值必须不同的情况

分离 WP_SITEURLWP_HOME 最常见的合理原因是子目录安装模式:您希望将 WordPress 文件隔离在一个干净的子目录中(例如 /wordpress/cms),同时让公共网站在根域名解析。这是一种有意为之的架构选择,而非变通方案。

其他需要更新一个或两个值的场景:

  • 域名迁移——从 http://old-domain.com 迁移到 https://new-domain.com 需要同时更新两个值。
  • HTTP 升级到 HTTPS——安装 SSL 证书意味着需要将两个设置中的协议前缀从 http:// 更改为 https://。只更新其中一个会产生混合内容错误。
  • 从预发布环境迁移到生产环境——预发布环境通常运行在子域名或不同域名上;部署时必须重写两个值。
  • 反向代理或 CDN 卸载——当负载均衡器或 CDN 终止 SSL 并将流量转发到后端服务器时,WordPress URL 设置必须反映面向公众的域名,而非内部服务器地址。
  • 多站点网络重新配置——在 WordPress 多站点中,WP_SITEURLWP_HOMEDOMAIN_CURRENT_SITEPATH_CURRENT_SITE 常量相互作用,使正确配置变得更加关键。

方法一:通过 WordPress 后台更新

当您仍有管理员访问权限且更改较为简单(例如在同一域名上从 HTTP 升级到 HTTPS)时,此方法最为合适。

  1. 登录 https://yourdomain.com/wp-admin
  2. 导航至 Settings > General
  3. 找到 WordPress Address(URL)Site Address(URL)字段。
  4. 根据需要更新两个值。
  5. 点击 Save Changes

WordPress 将立即将您重定向到更新后的管理员 URL。如果您更改了域名,浏览器将跟随重定向到新地址。如果新域名尚未解析到服务器,您将失去后台访问权限——请相应地规划 DNS 传播时间。

方法二:在 wp-config.php 中定义常量

此方法在生产服务器上更为推荐,因为它可以防止意外的 UI 更改,即使数据库暂时不可用也能正常工作,并且易于进行版本控制。在具有 root SSH 访问权限的 VPS 托管环境中,这是最可靠的方法。

在您偏好的编辑器中打开 wp-config.php

nano /var/www/html/wp-config.php

/* That's all, stop editing! */ 注释上方添加以下两行:

define( 'WP_HOME', 'https://example.com' );
define( 'WP_SITEURL', 'https://example.com' );

对于核心文件位于 /wordpress 但网站从根目录提供服务的子目录安装模式:

define( 'WP_HOME', 'https://example.com' );
define( 'WP_SITEURL', 'https://example.com/wordpress' );

保存并关闭文件。后台字段现在将变为只读,这是预期行为。

子目录安装:必需的 .htaccess 和 index.php 步骤

WP_HOMEWP_SITEURL 不同时,WordPress 本身无法将根域名请求路由到子目录中的核心文件。您必须在文档根目录放置一个修改过的 index.php 和一个 .htaccess 文件。

步骤一:index.php 从 WordPress 子目录复制到根目录:

cp /var/www/html/wordpress/index.php /var/www/html/index.php

步骤二:编辑复制的 /var/www/html/index.php 以指向子目录:

<?php
// WordPress view bootstrapper
define( 'WP_USE_THEMES', true );

/** Loads the WordPress Environment and Template */
require __DIR__ . '/wordpress/wp-blog-header.php';

步骤三:确保根目录的 .htaccess 包含标准的 WordPress 重写块:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

不要从子目录复制 .htaccess——它将包含 RewriteBase /wordpress/,这会破坏根域名路由。

方法三:通过 WP-CLI 直接更新数据库

当后台无法访问且您不希望永久修改 wp-config.php 时,WP-CLI 提供了一个简洁、可脚本化的解决方案。这在运行自动化部署流水线的独立服务器上特别有用。

wp option update siteurl 'https://example.com' --path=/var/www/html
wp option update home 'https://example.com' --path=/var/www/html

验证更改是否已应用:

wp option get siteurl --path=/var/www/html
wp option get home --path=/var/www/html

WP-CLI 遵循 wp-config.php 常量——如果 WP_SITEURLWP_HOME 已在其中定义,wp option update 命令将不会覆盖它们。您必须直接在文件中更新常量。

方法四:直接 MySQL 更新(最后手段)

仅在 SSH 访问可用但未安装 WP-CLI 且后台被锁定时使用此方法。首先确认您的表前缀(在 wp-config.php 中检查 $table_prefix,通常为 wp_)。

mysql -u db_user -p db_name
UPDATE wp_options SET option_value = 'https://example.com' WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value = 'https://example.com' WHERE option_name = 'home';

确认更新:

SELECT option_name, option_value FROM wp_options WHERE option_name IN ('siteurl', 'home');

退出 MySQL 并在测试网站之前清除所有对象缓存(Redis、Memcached 或 OPcache)。

SSL 配置与 URL 更新

从 HTTP 升级到 HTTPS 是同时更新两个 URL 参数最常见的原因。在安装 SSL 证书之后——无论是通过 Certbot 使用 Let’s Encrypt,还是通过SSL 证书等提供商购买的商业证书——您必须将 WP_HOMEWP_SITEURL 都更新为使用 https:// 前缀。

未能同时更新两者,或只更新其中一个,会产生混合内容警告:浏览器收到一个引用 HTTP 资源(脚本、样式表、图片)的 HTTPS 页面。现代浏览器会完全阻止混合主动内容,这会破坏 JavaScript 功能和管理后台。

更新 URL 常量后,对数据库运行搜索替换,以更新存储在文章内容、文章元数据和选项中的所有序列化 URL:

wp search-replace 'http://example.com' 'https://example.com' --all-tables --path=/var/www/html

--all-tables 标志确保自定义表(WooCommerce、页面构建器)中的序列化数据也得到更新。运行此命令前请务必备份数据库。

使用 cPanel 配置 WordPress URL

如果您在带 cPanel 的 VPS 上管理 WordPress,可以使用 cPanel 文件管理器编辑 wp-config.php,无需 SSH 访问:

  1. 登录 cPanel 并打开文件管理器
  2. 导航到您的 WordPress 文档根目录(通常为 public_html 或子目录)。
  3. 右键点击 wp-config.php 并选择编辑
  4. 按照方法二所示添加 WP_HOMEWP_SITEURL 常量。
  5. 保存文件。

或者,使用 cPanel 中的 phpMyAdmin 工具,直接对您的 WordPress 数据库运行方法四中的 SQL UPDATE 语句。

关键陷阱与边缘情况

两个设置之间的协议不匹配。WP_SITEURL 设置为 https://example.com,而将 WP_HOME 设置为 http://example.com(或反之),会造成重定向循环。浏览器跟随服务器的 HTTPS 重定向,但 WordPress 生成 HTTP 前端链接,服务器又将其重定向回 HTTPS。这个循环在后台中不可见,但对爬虫和用户来说是灾难性的。

尾部斜杠不一致。WordPress 对这些常量中的尾部斜杠很敏感。https://example.comhttps://example.com/ 被视为不同的值。始终在两个常量中省略尾部斜杠,以符合 WordPress 的内部预期。

URL 更改后的对象缓存污染。如果您的服务器运行持久对象缓存(Redis 或 Memcached),即使数据库已更新,旧的 URL 值也可能仍缓存在内存中。在任何 URL 更改后立即刷新对象缓存:

wp cache flush --path=/var/www/html

数据库中的序列化数据。WordPress 将许多选项值和文章元数据存储为 PHP 序列化字符串。简单的字符串替换(例如对数据库转储使用 sed)会因使字节计数前缀失效而损坏序列化数据。请始终使用 WP-CLI 的 search-replace 命令,它能正确处理序列化。

多站点网络注意事项。在 WordPress 多站点安装中,WP_SITEURL 适用于网络管理员,而非各个子站点。每个子站点在其各自的 wp_X_options 表中都有自己的 siteurlhome 条目。网络范围内的 URL 更改需要更新每个子站点的选项表,WP-CLI 通过 --network 标志来处理:

wp search-replace 'http://old-domain.com' 'https://new-domain.com' --all-tables --network --path=/var/www/html

反向代理标头信任。在负载均衡器或 Nginx 反向代理后面的服务器上,如果代理未转发 X-Forwarded-Proto 标头,WordPress 可能会检测到错误的协议。即使 URL 常量正确,内部链接也可能恢复为 HTTP。在 wp-config.php 中添加以下内容以强制 HTTPS 检测:

if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'] ) {
    $_SERVER['HTTPS'] = 'on';
}

更改后验证配置

更新任一 URL 参数后,在认为更改完成之前,请执行以下验证步骤:

# Confirm wp_options values reflect the change
wp option get siteurl --path=/var/www/html
wp option get home --path=/var/www/html

# Check for mixed-content issues using curl
curl -sI https://example.com | grep -i location

# Verify the REST API is reachable at the correct base
curl -s https://example.com/wp-json/ | python3 -m json.tool | head -20

# Confirm no HTTP references remain in post content
wp search-replace --dry-run 'http://example.com' 'https://example.com' --all-tables --path=/var/www/html

最后一个命令中的 --dry-run 标志会报告在不实际修改数据的情况下将进行多少次替换。如果计数为零,则迁移是干净的。

对于在共享虚拟主机或 VPS 环境中管理多个 WordPress 实例的团队,在部署后脚本中自动化此验证步骤,可以消除以陈旧 URL 引用上线网站的风险。

决策矩阵:选择哪种方法

情况推荐方法
后台可访问,简单的域名或协议更改Settings > General(方法一)
生产服务器,更改必须进行版本控制`wp-config.php` 常量(方法二)
后台被锁定,SSH 可用,已安装 WP-CLIWP-CLI `option update`(方法三)
后台被锁定,无 WP-CLI,SSH 可用直接 MySQL UPDATE(方法四)
cPanel 环境,无 SSHcPanel 文件管理器 + phpMyAdmin
多站点网络范围内的 URL 更改WP-CLI `search-replace –network`
迁移后清理序列化 URLWP-CLI `search-replace –all-tables`

技术要点核查清单

  • 除非您有意需要子目录模式,否则始终同时更新 WP_SITEURLWP_HOME
  • 在生产服务器的 wp-config.php 中定义常量,以防止意外的 UI 覆盖。
  • 任何 URL 更改后,刷新对象缓存并使用 --all-tables 运行 wp search-replace 以捕获序列化数据。
  • 对于 HTTP 到 HTTPS 的迁移,先更新 URL 常量,然后运行搜索替换,再使用 curl 验证混合内容。
  • 在子目录安装中,根目录的 index.php 必须引用子目录路径,且 .htaccess 必须使用 RewriteBase /
  • WP_HOMEWP_SITEURL 常量中切勿使用尾部斜杠。
  • 在反向代理设置中,在 wp-config.php 中添加 HTTP_X_FORWARDED_PROTO 检测,否则无论 URL 设置如何,WordPress 都会生成错误的协议引用。
  • 在多站点中,每个子站点的 wp_X_options 表必须独立更新;使用 WP-CLI 时加上 --network 标志。

常见问题解答

如果 WordPress Address 和 Site Address 不同但没有设置子目录,会发生什么?

WordPress 将尝试从 WP_SITEURL 中指定的路径加载核心文件。如果该路径不存在 WordPress 安装,所有管理员请求将返回 404 错误或白屏。如果 WP_HOME 正确且重写规则完整,前端可能仍能加载,但任何 AJAX 请求、REST API 调用或管理员操作都将失败。

我可以将 WP_HOME 和 WP_SITEURL 设置为不同的协议(一个 HTTP,一个 HTTPS)吗?

不可以。在两个常量之间混用协议会造成浏览器和爬虫都无法解决的重定向循环。两个常量必须使用相同的协议。如果您在服务器级别(通过 Nginx 或 Apache)强制使用 HTTPS,则两个常量都必须使用 https://

为什么 Settings > General 中的 WordPress Address 字段显示为灰色?

该字段为只读,因为 WP_SITEURL(或 WP_HOME)在 wp-config.php 中被定义为 PHP 常量。在代码中定义的常量优先于数据库值,无法通过 UI 覆盖。要使该字段再次可编辑,请在 wp-config.php 中删除或注释掉对应的 define() 行。

更改 Site Address 会影响我的 SEO 和现有反向链接吗?

会。更改 WP_HOME 会改变网站上每个页面的规范基础 URL。如果没有从旧 URL 结构到新 URL 结构的适当 301 重定向,搜索引擎会将新旧 URL 视为独立页面,分散链接权重并可能触发重复内容处罚。请在 URL 更改之前或同时配置服务器级别的 301 重定向。

如果我输入了错误的 URL 并因此被锁定在 wp-admin 之外,如何恢复?

通过 SSH 连接到您的服务器,使用方法二在 wp-config.php 中定义正确的常量,或使用 WP-CLI 通过方法三直接更新 siteurlhome 选项。如果两者都不可用,请使用 phpMyAdmin 或直接 MySQL 连接运行方法四中的 UPDATE 语句。恢复访问后,如果您希望后台管理这些值,请删除所有临时常量。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用