首页 › 博客 › 文章

WordPress HTTPS 配置:证书、混合内容与强制跳转

WordPress HTTPS 配置:证书、混合内容与强制跳转

结论先行

WordPress HTTPS 配置要做四件事:申请并自动续期证书、排查替换混合内容、把站点地址改成 https 并配 301 强制跳转、在反向代理下用 X-Forwarded-Proto 判断协议。验证标准是浏览器无锁形警告、页面资源全为 https、curl 返回 301 且 Location 正确。

证书申请与续期

2026 年主流是 Let’s Encrypt 的 90 天证书,用 certbot 或 acme.sh 自动签发。不要用付费证书的人工流程,续期会拖垮运维。

用 certbot 签发

Nginx 环境执行:

sudo certbot --nginx -d example.com -d www.example.com

Apache 把 --nginx 换成 --apache。certbot 会改虚拟主机配置并重载。

用 acme.sh 签发

适合多机同步场景:

curl https://get.acme.sh | sh -s email=admin@example.com
~/.acme.sh/acme.sh --issue -d example.com -w /var/www/html

证书落在 ~/.acme.sh/example.com/,fullchain 和 key 分开。

自动续期

certbot 装完自带 systemd timer,查状态:

systemctl list-timers | grep certbot

获取报价

邮箱 + 需求 + 预算区间,24 小时内回复报价。

acme.sh 需加 cron:

0 0 * * * ~/.acme.sh/acme.sh --cron --home ~/.acme.sh

踩坑:DNS 解析没生效就签发会失败,先 nslookup 确认。续期后 Nginx 不自动 reload 会旧证书,certbot 的 deploy-hook 里加 nginx -s reload。

混合内容排查

混合内容是 https 页面里加载了 http 资源,浏览器会拦或标不安全。数据库里的老文章、主题硬编码、第三方脚本是三大来源。

数据库替换

用 wp-cli 全站替换,先备份:

wp db export backup.sql
wp search-replace 'http://example.com' 'https://example.com' --all-tables --precise

不要直接改 SQL 文件,序列化数据会坏。 给 WordPress 搭一套 Staging 环境:不碰线上数据做试验 可以先在副本上跑 search-replace 验证。

主题插件里的硬编码

用 grep 扫 wp-content:

grep -rn 'http://' wp-content/themes wp-content/plugins --include='*.php' --include='*.js'

找到后改成协议相对 // 或直接用 esc_url( home_url() ) 拼接。

浏览器 DevTools 验证

打开 Console,混合内容会报 Mixed Content 错误。Network 面板过滤 scheme:http,看还有哪些请求。

实施步骤:站点地址与强制跳转

  1. 后台「设置-常规」把 WordPress 地址和站点地址改成 https,或用 wp-cli:wp option update home 'https://example.com' 和 wp option update siteurl 'https://example.com'。
  2. Nginx 加 301 跳转,80 端口 server 块写:return 301 https://$host$request_uri;。
  3. Apache 在 .htaccess 加:RewriteEngine On 和 RewriteCond %{HTTPS} off 与 RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]。
  4. 确认 wp-config.php 里没有 FORCE_SSL_ADMIN 冲突,需要后台强制 ssl 就留着 true。
  5. 清 CDN 和对象缓存,避免跳转被边缘节点缓存。
  6. 用 curl 验证:curl -I http://example.com 应返回 301 且 Location 是 https。

踩坑:改了 option 但没改服务器跳转,会出现重定向循环。回滚方案:把 option 改回 http,服务器跳转注释掉,重载服务。

反向代理下的判断

反向代理下的判断

前面挂了 Nginx 反向代理、Cloudflare 或负载均衡时,WordPress 收到的是 http,会误判成没开 https,导致后台跳登录或资源出 http。

传真实协议头

代理层加:

proxy_set_header X-Forwarded-Proto $scheme;

WordPress 靠 is_ssl() 函数判断,它读 HTTPS 或 X-Forwarded-Proto 为 https 时返回 true。wp-config.php 里补:

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

注意 XML 转义:上面代码块里 && 是源码里的 && 转义写法,实际文件里写两个 & 符号。

验证代理场景

写个 phpinfo 或临时 var_dump($_SERVER['HTTP_X_FORWARDED_PROTO']); 看值。 宝塔 LNMP 部署 WordPress:目录、权限与伪静态一次配好 里也覆盖了反向代理的协议头设置。

常见问题

证书续期后浏览器还是旧证书?

Nginx 没 reload。certbot 的 renew-hook 或 deploy-hook 里加重载命令,或手动 nginx -s reload。

强制跳转后后台进不去?

反向代理没传 X-Forwarded-Proto,WordPress 以为不是 https 反复跳。按上文补协议头和 wp-config 片段。

混合内容改完还有警告?

清 CDN 缓存和浏览器缓存,再查第三方统计、字体、iframe 的 src 是不是 http。

动作清单

  • 用 certbot 或 acme.sh 签发证书并配自动续期 timer/cron。
  • wp-cli 做 search-replace 清数据库混合内容,grep 扫主题插件硬编码。
  • 改 home 和 siteurl 为 https,服务器层配 301 跳转。
  • 反向代理环境传 X-Forwarded-Proto 并在 wp-config 设 HTTPS 为 on。
  • 上线前用 WordPress 上线前检查清单:26 项逐条过一遍 核对协议与跳转项。

需要专业团队落地 WordPress HTTPS 与运维?见 WordPress 开发服务,我们提供部署、排障与长期维护。

参考资料与延伸阅读

WPDaiwei

WPDaiwei-专业Wordpress网站定制开发提供商

需要 WordPress 开发服务?

24 小时内免费出方案与报价,国内国外都接单。

QQ