WP多站点配置AWS负载均衡与ACM SSL后HTTPS访问异常求助
解决AWS上WP多站点+ALB+ACM SSL的HTTPS访问问题
我之前在AWS上配置WordPress多站点+应用负载均衡(ALB)+ACM SSL证书时,遇到过和你几乎一模一样的问题,给你梳理下我当时排查和解决的关键步骤,应该能帮到你:
一、先检查负载均衡(ALB)的核心配置
- 证书覆盖范围:确保你在ACM申请的证书同时包含
foobar.com和www.foobar.com两个域名(申请时选「多域名证书」或者用通配符*.foobar.com),如果证书只覆盖其中一个,另一个域名的SSL请求肯定会出问题。 - 监听器设置:
- 80端口:配置为HTTP到HTTPS的重定向(不要直接转发到EC2),这样所有HTTP请求都会自动跳转到HTTPS。
- 443端口:绑定你的ACM证书,转发协议选HTTP(因为ALB已经终止了SSL,EC2只需要处理HTTP请求即可),目标组指向EC2的80端口。
- 目标组健康检查:确认ALB的目标组显示EC2实例是「健康」状态,如果健康检查失败,请求会直接超时。
- DNS解析:不管是
foobar.com还是www.foobar.com,DNS解析都要指向ALB的CNAME地址(不要直接解析到EC2实例),这是很多人容易犯的错误,会导致超时或SSL失效。
二、EC2上Apache(httpd)的配置调整
- 启用X-Forwarded-Proto头部识别:因为ALB会把HTTPS请求转换成HTTP转发给EC2,WordPress需要知道原始请求是HTTPS的,否则会出现跳转错误。在
httpd.conf或者你的虚拟主机配置文件中添加:
SetEnvIf X-Forwarded-Proto "https" HTTPS=on
- 允许.htaccess生效:确保虚拟主机配置里有
AllowOverride All,因为WordPress多站点的重写规则完全依赖.htaccess文件,否则自定义的重写规则不会生效:
<Directory /var/www/html> AllowOverride All Require all granted </Directory>
- 重启Apache服务:修改配置后记得执行
sudo systemctl restart httpd(CentOS/RHEL)或者sudo systemctl restart apache2(Ubuntu)让配置生效。
三、wp-config.php的关键配置
在wp-config.php文件末尾添加以下代码,强制WordPress使用HTTPS并适配多站点环境:
// 强制后台使用HTTPS define('FORCE_SSL_ADMIN', true); // 动态识别HTTPS协议,适配ALB转发 if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; } define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST']); define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST']); // 多站点Cookie安全设置,避免登录或会话问题 define('COOKIE_SECURE', true); define('COOKIE_HTTPONLY', true); define('COOKIE_SAMESITE', 'Strict'); // 多站点核心配置(根据你的模式调整) define('DOMAIN_CURRENT_SITE', 'foobar.com'); // 主域名 define('SUBDOMAIN_INSTALL', true); // 子域名模式设为true,子目录模式设为false define('PATH_CURRENT_SITE', '/'); define('SITE_ID_CURRENT_SITE', 1); define('BLOG_ID_CURRENT_SITE', 1);
四、更新WordPress多站点的.htaccess规则
替换你的.htaccess文件内容为以下适配HTTPS的规则(子域名模式,子目录模式可以参考WP后台给出的规则调整):
RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] # 强制HTTPS跳转(适配ALB的X-Forwarded-Proto头部) RewriteCond %{HTTP:X-Forwarded-Proto} !=https RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 处理wp-admin的尾部斜杠 RewriteRule ^wp-admin$ wp-admin/ [R=301,L] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule ^(wp-(content|admin|includes).*) $1 [L] RewriteRule ^(.*\.php)$ $1 [L] RewriteRule . index.php [L]
五、排查你遇到的具体问题
- https://foobar.com超时:先检查根域名的DNS解析是否指向ALB,再看ALB目标组的EC2实例是否健康,EC2的安全组是否允许ALB的80端口流量(不要只允许443,因为ALB转发的是HTTP到EC2的80)。
- https://www.foobar.com SSL被忽略:优先检查ACM证书是否包含
www.foobar.com,然后看ALB的443监听器是否绑定了正确的证书,最后确认www域名的DNS解析是否指向ALB。
最后说句题外话,确实,如果是简单的WordPress站点,WPEngine这类托管服务确实能省掉很多服务器配置的麻烦,但AWS的优势在于灵活性和可扩展性,折腾完这套流程也能学到不少东西😉
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

