我正在尝试将所有HTTP请求重定向到我的服务器,并切换到HTTPS。
ELB正在监听端口80,并在我的应用程序上将所有请求转发到端口8088。然后,应用程序发送一个301永久移动响应,重定向到同一URL,但删除了所有端口并添加了“https://”。这会导致客户端通过HTTPS重新请求url。
当我在本地测试它时,它工作得很好,但当我将它部署到弹性负载平衡器后面的EC2时,返回了502坏网关。服务器正在接收请求,并且似乎正确地发送了重定向(正如我所说,当我直接命中服务器时,它会工作,而不是通过负载平衡器)。
事实证明,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访问网络服务器时,一切正常,我的所有用户流量都发送到单个网络服务器。当我打开一个新选项卡时,似乎启动了一个新会话,我的用户流量可以发