当前位置: 首页 > 知识库问答 >
问题:

在Amazon负载平衡器之后,如何修复WordPress HTTPS问题?

柴砚文
2023-03-14

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

我在这里找到了一个解决方案,但需要修改WordPress core,这对可更新性没有好处:https://wordpress.org/support/topic/when-behind-amazon-web-services-elastic-load-balancer-causes-endless-redirect

有没有办法在不修改WordPress核心的情况下解决这个问题?我使用的是Apache 2.2。

共有3个答案

商宝
2023-03-14

如果其他人正在寻找与此等效的Nginx,您需要做以下几点:

对于重写设置,应在服务器块下添加以下内容:

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

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

if ($http_x_forwarded_proto = 'https') {
    set $fe_https 'on';
}
fastcgi_param HTTPS $fe_https;

如果您有任何其他命令(我在我的fastcgi\u-params文件中有),请记住删除它。

叶智
2023-03-14

WordPress文档中的另一个选项是将其添加到wp配置中。php:

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';
傅峻
2023-03-14

与您给出的链接一样,WordPress的问题也存在于is\u ssl()函数中,与大多数PHP软件一样,该函数会显式检查$\u服务器['HTTPS']$\u服务器['SERVER\u PORT'],以检查当前页面是否在HTTPS://context中被访问。

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

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

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

<IfModule mod_setenvif.c>
  SetEnvIf X-Forwarded-Proto "^https$" HTTPS
</IfModule>

这只是读取X-Forwarded-Proto头。如果此值等于https,则环境变量设置为1。PHP将看到这个环境变量,最终,它将成为等于1的服务器['HTTPS']——就像“真正的”本地SSL请求一样。

 类似资料:
  • AWS推出了应用程序负载平衡器,可以进行基于路径的路由。是否可以将经典负载平衡器放在应用程序负载平衡器之后。 示例:假设我们有两个经典的负载平衡器。应用程序负载平衡器将流量路由到所有url(如应用程序负载平衡器/前端)的第一个经典负载平衡器,并将流量路由到所有url(如应用程序负载平衡器/后端)的第二个经典负载平衡器* 目前,似乎我们只能将主机置于应用程序负载平衡器之后。是否可以将负载平衡器置于应

  • 我试图为我们的服务器安装负载平衡器。如果使用http,它可以正常工作。但是当我切换到https时 我在浏览器控制台中遇到以下错误: 混合内容:页面位于'https://www.something.com/'通过HTTPS加载,但请求了一个不安全的脚本'…mootools.js'。此请求已被阻止;内容必须通过HTTPS提供 我想我做了一些硬代码,比如“http://www.something.com

  • 我有一个非常简单的Spring Boot应用程序,具有社交单点登录功能。 看起来是这样的: 它在应用程序中有必需的条目。yml: 它在我的本地机器上运行得很好,并且只启动了一个实例。 当有多个实例隐藏在负载平衡器后面时,就会出现问题。 即使用户在第一个请求中进行身份验证,向负载均衡器发出的后续请求也会因401而被阻止。 与第一个应用程序实例相比,请求被路由到不同的应用程序实例。 我正在试图弄清楚,

  • 我试图在AWS EKS集群中托管以下(部署前端)Kubernetes部署,在部署部署并创建服务和入口之后,所有的东西都成功地部署和创建了,但是当我试图从外部访问负载平衡器DNS时,这个负载平衡器是不可访问的。有人能指出原因吗? **下面的代码(deployment-2048)正在工作,负载均衡器是可访问的,但在(部署前端)**的情况下是不可访问的。

  • 是否有一种方法可以在微服务的两个pod之间进行主动和被动负载平衡。假设我有两个运行微服务的实例(pod),它是使用K8s服务对象公开的。是否有一种方法来配置负载平衡,使一个pod始终获得请求,当该pod停机时,另一个po将开始接收请求? 我在该服务的顶部还有一个ingress对象。

  • 我有两条溪流。一个是事件流,另一个是数据库更新流。我想用从DB更新流构建的信息丰富事件流。 事件流非常庞大,使用5个字段进行分区。这给了我很好的分配。DB流不那么喋喋不休,并且使用两个字段进行分区。我目前正在使用两个公共字段连接这两个流,并使用flapMap来丰富第一个流。flatMap运算符使用ValueState维护状态,状态由两个公共字段自动键入。 除了实现自定义逻辑来手动提取键并更新维护状