使用 wordpress https 插件的 AWS ELB 和 wordpress 站点的无限重定向循环

使用 wordpress https 插件的 AWS ELB 和 wordpress 站点的无限重定向循环

我已经配置了一个 AWS ELB 来指向运行 Wordpress 3.2.1 的 Ubuntu 服务器。在我将其置于负载均衡器之后,服务器上的一切运行都很好。

我设置了负载均衡器将端口 80 转发到端口 80,将端口 443 转发到端口 80。

我设置了虚拟主机文件来检查来自 elb 的标头:

RewriteEngine 在
RewriteCond %{HTTP:X-Forwarded-Proto} 上!https
RewriteRule !/statushttps://%{服务器名称}%{请求URI} [左,右]

现在,每当我访问 https URL 时,我都会收到此消息:

此网页有重定向循环
网页位于https://mywebsite.com/securepage/导致过多重定向

一旦我禁用 wordpress https 插件
http://wordpress.org/extend/plugins/wordpress-https/
页面可以正常运行,但现在充满了混合内容。应该是 https 的页面不再是 https。

只要我直接访问服务器而不是通过 elb,它就可以再次工作。

关于如何使其与 AWS ELB 配合使用,您有什么想法吗?

答案1

如果您不发布 ELB 配置,我大胆猜测 ELB 正在将 HTTPS (443/tcp) 流量重定向到 HTTP (80/tcp) 上的 EC2 实例。然后,您.htaccess和插件正在尝试将其重定向回 HTTPS,因为它是通过 HTTP 看到的。

去看看你的 EC2 控制台Network & Security > Load Balancers,我想你会看到Port Configuration类似这样的内容443 forwarding to 80 (HTTPS, Certificate: blah)

答案2

尝试将其添加到您的httpd.conf.htaccess

SetEnvIfNoCase X-FORWARDED-PROTO "^https$" HTTPS

当使用负载均衡器 + HTTPS 时,您的 Web 服务器并不知道前端正在使用 HTTPS,因此会不断尝试重定向到 HTTPS 站点,而事实上,HTTPS 已经在使用中。

上述代码将把 Amazon 的负载均衡器发送的标头 ( X-Forwarded-Proto: https) 转换为 Wordpress 和其他 PHP 脚本可以理解的环境变量 ( HTTPS=1)

答案3

根据亚马逊这里https://d0.awsstatic.com/whitepapers/deploying-wordpress-with-aws-elastic-beanstalk.pdf解决方法是:

/** Detect if SSL is used. This is required since we are terminating SSL either on CloudFront or on ELB */ 
if (($_SERVER['HTTP_CLOUDFRONT_FORWARDED_PROTO'] == 'https') OR ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
    {$_SERVER['HTTPS']='on';}

我仍然陷入无限循环,因此我将 WordPress 配置更改为:

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

到:

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

这将强制用户使用 https,即使他们输入的是 http,此外,它还可以轻松地离线开发网站,因为您只需将 WP_HOME 更新为本地主机,https 就不再是默认设置

答案4

正如@Tim 所建议的,$_SERVER['HTTPS']='on';wp-config.php 中的这个功能对我很有用。

我还将其添加到我的 .htaccess 文件中以强制使用 HTTPS:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]

相关内容