如何在Amazon Load Balancer后面修复Wordpress HTTPS问题?

A.B*_*oll 48 wordpress https amazon-ec2 amazon-web-services amazon-elb

我以前遇到过这个问题.在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.

A.B*_*oll 64

正如你给出的链接建议的那样,对于Wordpress,问题在于is_ssl()函数,就像大多数PHP软件一样,显式检查$_SERVER['HTTPS']$_SERVER['SERVER_PORT']检查当前页面是否在https://上下文中被访问.

当您的页面通过HTTPS访问,但是Amazon Load Balancer正在执行SSL卸载并实际在非SSL端口80上请求您的内容时,Web服务器,PHP或其他任何内容都无法理解或看到它正在通过https://访问.

解决这个问题的方法是,亚马逊的ELB发送事实上的标准X-Forwareded-ProtoHTTP标头,我们可以用它来确定客户端在Load Balancer另一侧实际使用的协议.

使用Apache 2.2,您可以使用以下内容:

<IfModule mod_setenvif.c>
  SetEnvIf X-Forwarded-Proto "^https$" HTTPS
</IfModule>
Run Code Online (Sandbox Code Playgroud)

这只是读取X-Forwared-Proto标题,如果它等于https,则将HTTPS环境变量设置为1.PHP将看到这个环境变量,并最终将变为$_SERVER['HTTPS']等于1- 就像它对于"真正的"本机SSL请求一样.

  • 工作正常,您需要确保已启用 apache2 模块 setenvif。 (2认同)

zer*_*mpl 29

wordpress文档的另一个选项是将它添加到你的wp-config.php:

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';
Run Code Online (Sandbox Code Playgroud)


Gal*_*mor 10

如果其他人正在寻找与此相当的Nginx,这就是你需要做的:

对于重写设置,您应该在server块下添加以下内容:

if ($http_x_forwarded_proto != 'https') {
    rewrite ^ https://$host$request_uri? permanent;
}
Run Code Online (Sandbox Code Playgroud)

要设置HTTPS参数,您应该在location ~ \.php$块下添加以下内容:

if ($http_x_forwarded_proto = 'https') {
    set $fe_https 'on';
}
fastcgi_param HTTPS $fe_https;
Run Code Online (Sandbox Code Playgroud)

fastcgi_param HTTPS如果你有任何其他命令(我在我的fastcgi_params文件中有它),请记得删除任何其他命令.


小智 7

在WordPress中使用ssl时,请使用此4步骤方法来消除重定向循环和混合内容问题。

1)在数据库中用“ //”替换“ http://”-这将创建图像和其他资产的所有相对URL

2)在wp-config中,定义通用wp_home和wp_siteurl变量。

define('WP_HOME','//'. $_SERVER['SERVER_NAME']);
define('WP_SITEURL','//'. $_SERVER['SERVER_NAME']);
Run Code Online (Sandbox Code Playgroud)

3)如果使用负载平衡器,请使用“ HTTP_X_FORWARDED_PROTO”服务器变量来确定所使用的协议。为此,请在wp-config中添加此行

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';
Run Code Online (Sandbox Code Playgroud)

4)最后,在.htaccess中,如果您位于loadbalancer后面,请使用此行将所有流量重定向到https。

 # http to https
 RewriteCond %{HTTP:X-Forwarded-Proto} =http
 RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 5

不幸的是,以上都没有为我解决混合内容错误。然而,什么工作是将协议添加到 wp-config.php 中的 WP_HOME && WP_SITEURL 变量,例如

define( 'WP_HOME', 'https://' . $_SERVER['HTTP_HOST']); define( 'WP_SITEURL', WP_HOME );

之后,源中的所有 URL 都以 https 开头,所有混合内容错误都消失了。