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

为什么从amazon弹性负载平衡器后面发送重定向时,我会得到一个502坏网关?

邓兴为
2023-03-14

我正在尝试将所有HTTP请求重定向到我的服务器,并切换到HTTPS。

ELB正在监听端口80,并在我的应用程序上将所有请求转发到端口8088。然后,应用程序发送一个301永久移动响应,重定向到同一URL,但删除了所有端口并添加了“https://”。这会导致客户端通过HTTPS重新请求url。

当我在本地测试它时,它工作得很好,但当我将它部署到弹性负载平衡器后面的EC2时,返回了502坏网关。服务器正在接收请求,并且似乎正确地发送了重定向(正如我所说,当我直接命中服务器时,它会工作,而不是通过负载平衡器)。

共有1个答案

邓正真
2023-03-14

事实证明,ELB对其认为“有效”的响应非常挑剔,如果不满意,将返回502个坏网关。我通过确保来自服务器的响应具有以下标题来修复它:

如果我在听http://example.com

我发回以下回复:

HTTP/1.1 301 Moved Permanently
Content-Type: */*; charset="UTF-8"
Location: https://example.com/
Content-Length: 0

这让ELB很开心,一切正常。

出于兴趣,下面是代码(Java,使用Simpleframework):

private static void startHttpsRedirector() throws IOException {
    org.simpleframework.http.core.Container container = new org.simpleframework.http.core.Container() {
        @Override
        public void handle(Request request, Response response) {
            Path path = request.getPath();
            Query query = request.getQuery();
            String rawHost = request.getValue("host");

            System.out.println("Raw host: " + rawHost);
            System.out.println("Raw path: " + path);
            System.out.println("Raw query: " + query);

            String host = rawHost.replaceFirst("\\:.*", "");
            response.setStatus(Status.MOVED_PERMANENTLY);
            String redirectTo = "https://" + host + path + (query.values().size() > 0 ? "?" + query : "");

            System.out.println("redirectTo = " + redirectTo);
            response.setContentType("*/*; charset=\"UTF-8\"");
            response.setValue("Location", redirectTo);
            response.setContentLength(0);
            try {
                response.commit();
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    Server server = new ContainerServer(container);
    Connection connection = new SocketConnection(server);
    SocketAddress address = new InetSocketAddress(8088);
    connection.connect(address);
}

同样的javascript代码可以在这里找到:https://gist.github.com/dhobbs/6164710

 类似资料:
  • 我有一个在Amazon的弹性负载均衡器后面运行的ASP. NET MVC 4应用程序。当我在负载均衡器和Web服务器上安装SSL证书并在Web服务器层终止SSL时,一切正常。 但是,当我尝试在负载平衡器层终止,将内部流量从负载平衡器转发到端口80上未加密的web服务器时,RequireHttps属性会导致重定向循环。这似乎是有道理的,因为它正在请求一个加密的通道,而不知道它正在得到一个加密的通道(

  • 我们试图在自动缩放的AWS中使用弹性负载平衡,这样我们就可以根据需要进行缩放。 我们的应用程序由几个较小的应用程序组成,它们都位于同一子网和同一VPC上。 我们想把我们的ELB放在一个应用程序和其他应用程序之间。 问题是我们希望负载均衡器在内部使用API的不同应用程序之间工作,并且面向互联网,因为我们的应用程序仍然有一些应该在外部而不是通过API完成的用法。 我已经读过这个问题,但我无法从那里准确

  • 在Kubernetes中创建负载平衡器类型的服务时,它是创建一个全新的外部负载平衡器,还是只为负载平衡器类型的第一个服务创建一个负载平衡器,并将该负载平衡器重新用于负载平衡器类型的所有后续服务? 这个问题特别重要,因为为每个服务构建一个单独的负载平衡器对我来说成本太高。 如果它特定于云提供商,我使用Azure,但我很想知道其他云提供商是否不同。

  • 以下是我的设置: EC2与Apache使用弹性负载均衡器。 我希望所有超文本传输协议流量都自动重定向到https。我找到了这个reco,并通过添加到我的httpd.conf文件中来尝试: 然而,这在我重新启动服务器之前或之后都不起作用。HTTP没有重定向,我的站点抛出了各种错误,直到我从配置中删除了该规则。 我认为我更新文件错误或负载均衡器设置不正确。对于负载均衡器的侦听器,我有LB协议HTTP,

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

  • 在我的AWS帐户中,我当前有一个网络负载平衡器(TCP),它指向两个可用性区域(web服务器)上的两个Ec2实例,每个可用性区域都运行一个tomcat,它指向一个Ec2实例,即应用程序服务器/数据库。 在NLB上,粘性会话是启用的,因此当我在单个选项卡上从Chrome访问网络服务器时,一切正常,我的所有用户流量都发送到单个网络服务器。当我打开一个新选项卡时,似乎启动了一个新会话,我的用户流量可以发