我以前遇到过这个问题。在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。
答案 0 :(得分:61)
正如您给出的链接所建议的那样,对于WordPress,问题出在is_ssl()
函数,就像大多数PHP软件明确检查$_SERVER['HTTPS']
和$_SERVER['SERVER_PORT']
一样,检查当前页面是否为在https:// context中访问。
当您通过HTTPS访问您的页面,但Amazon Load Balancer正在执行SSL卸载并实际在非SSL端口80上请求您的内容时,Web服务器,PHP或其他任何内容都无法理解或看到它是通过https://。
访问的对此的修复是,亚马逊的ELB发送了事实上的标准X-Forwareded-Proto
HTTP标头,我们可以用它来确定客户端实际使用哪个协议。负载均衡器的一面。
使用Apache 2.2,您可以使用以下内容:
<IfModule mod_setenvif.c>
SetEnvIf X-Forwarded-Proto "^https$" HTTPS
</IfModule>
这只是读取X-Forwared-Proto
标头,如果它等于https
,则将HTTPS
环境变量设置为1
。 PHP将看到这个环境变量,最终它将变为$_SERVER['HTTPS']
等于1
- 就像它对于“真正的”原生SSL请求一样。
答案 1 :(得分:22)
WordPress documentation的另一个选项是将此添加到你的wp-config.php中:
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';
答案 2 :(得分:9)
如果其他人正在寻找与此相当的Nginx,这就是你需要做的事情:
对于重写设置,您应在server
块下添加以下内容:
if ($http_x_forwarded_proto != 'https') {
rewrite ^ https://$host$request_uri? permanent;
}
要设置HTTPS参数,您应在location ~ \.php$
块下添加以下内容:
if ($http_x_forwarded_proto = 'https') {
set $fe_https 'on';
}
fastcgi_param HTTPS $fe_https;
如果您有任何其他fastcgi_param HTTPS
命令,请记得删除它(我已在我的fastcgi_params
文件中将其删除。)
答案 3 :(得分:4)
不幸的是,上述任何一个都没有为我解决混合内容错误。然而,有什么工作是将协议添加到WP_HOME&amp;&amp; wp-config.php中的WP_SITEURL变量,例如
define( 'WP_HOME', 'https://' . $_SERVER['HTTP_HOST']);
define( 'WP_SITEURL', WP_HOME );
之后,源代码中的所有网址都以https开头,所有混合内容错误都消失了。
答案 4 :(得分:4)
在WordPress中使用ssl时,使用此4步方法删除重定向循环和混合内容问题。
1)替换&#39; http://&#39;用&#39; //&#39;在数据库中 - 这将为图像和其他资产创建所有相对URL
2)在wp-config中,定义泛型wp_home和wp_siteurl变量。
define('WP_HOME','//'. $_SERVER['SERVER_NAME']);
define('WP_SITEURL','//'. $_SERVER['SERVER_NAME']);
3)如果您使用的是负载均衡器,请使用&#39; HTTP_X_FORWARDED_PROTO&#39;服务器变量以确定使用的协议。为此,请在wp-config
中添加此行if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';
4)最后在.htaccess中,如果你在loadbalancer后面将所有流量重定向到https,请使用此行。
# http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]