我以前也遇到过这种情况。当在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。
7条答案
按热度按时间js81xvg61#
就像你建议的链接一样,对于WordPress,问题在于
is_ssl()
函数,它像大多数PHP软件一样显式检查$_SERVER['HTTPS']
和$_SERVER['SERVER_PORT']
,以检查当前页面是否在https://上下文中访问。当您的页面通过HTTPS访问,但Amazon Load Balancer正在执行SSL卸载并实际在非SSL端口80上请求您的内容时,Web服务器、PHP或其他任何东西都无法理解或看到它正在通过https://访问。
对此的解决方案是Amazon的ELB发送事实上的标准
X-Forwarded-Proto
HTTP头,我们可以使用它来确定客户端在负载均衡器的另一端实际使用的是哪个协议。在Apache 2.2中,你可以使用如下代码:
这只是读取
X-Forwarded-Proto
头。如果该值等于https
,则HTTPS
环境变量设置为1
。PHP将看到这个环境变量,最终它将变成$_SERVER['HTTPS']
,它等于1
--就像“真实的的”原生SSL请求一样。y1aodyip2#
WordPress文档中的另一个选项是将其添加到wp-config.php:
wpcxdonn3#
如果其他人正在寻找与此等效的Nginx,这里是你需要做的:
对于重写设置,您应该在
server
块下添加以下内容:为了设置HTTPS参数,您应该在
location ~ \.php$
块下添加以下内容:记住删除任何其他
fastcgi_param HTTPS
命令(如果有)(我的fastcgi_params
文件中有)。2eafrhcq4#
使用这4个步骤的方法来消除在WordPress中使用SSL时的重定向循环和混合内容问题。
1)将数据库中的'http://'替换为'//'-这将创建图像和其他资源的所有相对URL
2)在wp-config中,定义通用wp_home和wp_siteurl变量。
3)如果您使用的是负载均衡器,请使用“HTTP_X_FORWARDED_PROTO”服务器变量来确定所使用的协议。为此,在wp-config中添加这一行
4)最后,在.htaccess中,如果你在负载均衡器后面,使用这一行将所有流量重定向到https。
0md85ypi5#
不幸的是,上述两种方法都没有解决我的混合内容错误。然而,真正起作用的是将协议添加到wp-config.php中的WP_HOME && WP_SITEURL变量中,例如。
define( 'WP_HOME', 'https://' . $_SERVER['HTTP_HOST']); define( 'WP_SITEURL', WP_HOME );
之后,源代码中的所有URL都以https开头,所有混合内容错误都消失了。
fykwrbwg6#
我的服务器环境是:
Ubuntu 20.04.3 LTS, PHP 8.0.11, nginx/1.18.0
/etc/nginx/sites-available/default
中的以下设置对我有效:dm7nw8vv7#
关于几乎完美的@A.B.卡罗尔回答,我建议将此环境变量设置为“on”:
在我的Dockerfile中,我包含了这一行来解决反向代理(即Traeffik)背后的Apache问题: