负载均衡器终止HTTPS时配置WordPress强制使用HTTPS
解决负载均衡器终止HTTPS后WordPress链接全为HTTP的问题
我之前也碰到过一模一样的场景——负载均衡器在外层扛HTTPS,后端WordPress只跑HTTP,结果前台后台全是HTTP链接,浏览器直接拦了样式和脚本,折腾了好几种方法都没用,后来终于找到靠谱的解决方式了,给你梳理一下:
为什么会出现这个问题?
WordPress生成链接的时候,是靠$_SERVER全局变量里的HTTPS和SERVER_PORT来判断当前是HTTP还是HTTPS请求的。但负载均衡器已经把HTTPS连接终止了,转发给WordPress的是HTTP请求,所以WordPress默认会认为自己在跑HTTP,自然输出的所有链接都是HTTP的。
你试过的方法为什么无效?
upgrade-insecure-requests标签:这个只能让浏览器把HTTP请求主动升级成HTTPS,但WordPress后台的很多核心链接生成逻辑还是会输出HTTP,而且有些后台功能(比如媒体上传、插件更新)依赖正确的站点协议,所以这个方法只能解决部分前台问题,后台根本搞不定。- 修改
WP_SITEURL和WP_HOME:如果直接硬改成HTTPS地址,可能因为缓存(比如浏览器缓存、服务器缓存、WordPress的对象缓存)导致站点加载异常,而且如果负载均衡器的配置没同步好,也会出问题。
靠谱的解决方案
直接在wp-config.php文件的最顶部(一定要在任何WordPress初始化代码之前)添加以下代码:
$_SERVER['HTTPS'] = 'on'; $_SERVER['SERVER_PORT'] = 443;
这样就能强制让WordPress认为当前请求是HTTPS的,生成的所有链接(包括前台、后台、媒体文件、脚本样式)都会自动变成HTTPS。
如果你的负载均衡器支持传递X-Forwarded-Proto请求头(大部分主流负载均衡器比如Nginx、AWS ALB、Cloudflare都支持),更推荐用下面的动态判断代码,比硬编码更灵活:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; $_SERVER['SERVER_PORT'] = 443; }
这个代码会先检查负载均衡器传来的头,确认是HTTPS请求时再设置相应的$_SERVER变量,这样如果后续站点切换回HTTP也不用改代码。
关于WordPress日志的小补充
如果以后需要看WordPress日志,可以在wp-config.php里开启调试模式:
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false);
开启后,日志会存在wp-content/debug.log文件里,这样就能排查各种加载异常的问题了。
内容的提问来源于stack exchange,提问作者micah
相关产品推荐
相关产品推荐

