如何在Amazon负载均衡器后解决WordPress的HTTPS问题?
如何在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。
另一个从WordPress文档中的选项是将下面的代码添加到您的wp-config.php文件中:
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) $_SERVER['HTTPS']='on';
就像你提供的链接所建议的那样,对于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请求一样。