You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress迁移Docker后资源链接HTTP转HTTPS问题排查

WordPress 资源链接机制与 Docker+Traefik 迁移问题解决思路

先搞懂 WordPress 构建资源链接的核心逻辑

WordPress 生成内部资源(JS/CSS、页面链接等)主要靠 site_url() 和 home_url() 这俩核心函数,它们的行为逻辑是:

  • 优先读取数据库 wp_options 表中的 siteurl 和 home 字段(就是你在后台设置的「WordPress 地址」和「站点地址」)
  • 结合 is_ssl() 函数判断当前请求是否为 HTTPS,进而决定生成 HTTP 还是 HTTPS 链接
  • is_ssl() 函数默认检测 $_SERVER['HTTPS'] 是否为 on、$_SERVER['SERVER_PORT'] 是否为 443,但反向代理场景下(比如你用 Traefik),容器里的 Apache 收到的是 HTTP 请求,所以默认情况下 WordPress 会误以为当前是 HTTP 请求,自然生成 HTTP 链接。

一步步解决你的问题

1. 让 WordPress 正确识别 Traefik 的反向代理协议

Traefik 作为反向代理,会给后端容器发送 X-Forwarded-Proto 头,告诉后端真实的请求协议是 HTTP 还是 HTTPS。我们需要让 WordPress 信任这个头,在 wp-config.php 中添加:

// 检测反向代理传递的真实协议,自动设置 HTTPS 标识
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

别直接硬写 $_SERVER['HTTPS']='on',这种写法太死板,会导致 HTTP 请求也被强制转 HTTPS,不符合你 Traefik 同时处理两种请求的需求。

2. 修复 /wp-admin 「无权访问」的问题

你之前加了 FORCE_SSL_LOGIN 和 FORCE_SSL_ADMIN 但报错,核心原因是站点地址配置和实际请求协议不匹配,或者 Cookie 规则冲突:

  • 先把数据库里的站点地址改成 HTTPS:
    如果你用 wp-cli(推荐),直接执行:
    wp option update siteurl 'https://yourdomain.com'
    wp option update home 'https://yourdomain.com'
    
    没有 wp-cli 的话,直接在 wp-config.php 里强制定义(跳过数据库读取):
    define('WP_HOME', 'https://yourdomain.com');
    define('WP_SITEURL', 'https://yourdomain.com');
    
  • 再调整 Cookie 相关配置,避免权限验证时的路径/域冲突:
    define('FORCE_SSL_LOGIN', true);
    define('FORCE_SSL_ADMIN', true);
    define('ADMIN_COOKIE_PATH', '/');
    define('COOKIE_DOMAIN', '');
    define('COOKIEPATH', '');
    define('SITECOOKIEPATH', '');
    

3. 修复 jQuery 等静态资源仍用 HTTP 的问题

这种情况大概率是数据库里残留了 HTTP 格式的链接,比如文章内容、自定义字段、主题/插件设置里的资源地址:

  • 用 wp-cli 做全局搜索替换(记得替换成你的域名):
    wp search-replace 'http://yourdomain.com' 'https://yourdomain.com' --skip-columns=guid
    
    加 --skip-columns=guid 是因为 guid 字段是文章的永久标识,不需要修改。
  • 如果还有个别资源是 HTTP,检查是否是主题/插件硬编码了 URL,去对应设置里改成相对路径或者 HTTPS 格式即可。

4. 调整 .htaccess 适配 Docker+Traefik 环境

从 cPanel 迁移过来的 .htaccess 可能包含针对 cPanel 环境的 HTTPS 规则,和 Traefik 冲突。建议替换成标准的 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

如果需要在容器内做双重保险的 HTTP 转 HTTPS 重定向,再添加:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

内容的提问来源于stack exchange,提问作者Alessandro Dentella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:42:47