如何在Amazon负载均衡器后解决WordPress的HTTPS问题?

10 浏览
0 Comments

如何在Amazon负载均衡器后解决WordPress的HTTPS问题?

我之前也遇到过这个问题。在Amazon的EC2负载均衡器后运行WordPress(或其他PHP脚本)时,脚本没有意识到它们正在https://协议上运行,导致问题,如无休止的重定向循环和HTTPS警告(“此页面上的某些内容正在以非安全的方式请求...”)。

我在这里找到了一个解决方案,但需要修改WordPress核心代码,这对更新性来说不好:https://wordpress.org/support/topic/when-behind-amazon-web-services-elastic-load-balancer-causes-endless-redirect

是否有一种方法可以在不修改WordPress核心的情况下解决此问题?我正在使用Apache 2.2。

admin 更改状态以发布 2023年5月21日
0
0 Comments

另一个从WordPress文档中的选项是将下面的代码添加到您的wp-config.php文件中:

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';

WordPress文档

0
0 Comments

就像你提供的链接所建议的那样,对于WordPress,问题出在is_ssl()函数上,这个函数像大多数PHP软件一样显式地检查$_SERVER['HTTPS']$_SERVER['SERVER_PORT']以检查当前页面是否在https://上下文中被访问。

当您的页面通过HTTPS访问,但亚马逊负载均衡器执行SSL卸载,并在非SSL端口80上请求您的内容时,Web服务器、PHP或其他任何事物都不理解或看到它正在通过https://被访问。

解决此问题的方法是Amazon的ELB发送事实上的标准X-Forwarded-Proto HTTP头,我们可以使用它来确定负载均衡器另一侧客户端实际使用的协议。

使用Apache 2.2,您可以使用以下代码:


  SetEnvIf X-Forwarded-Proto "^https$" HTTPS

它只是读取X-Forwarded-Proto头。如果这个值等于https,那么HTTPS环境变量会被设置为1。PHP会看到这个环境变量,并且最终它将成为$_SERVER['HTTPS']等于1--就像对于一个“真正”的本地SSL请求一样。

0