5

我正在尝试将任何 HTTP 请求重定向到我的服务器到 HTTPS。

ELB 正在侦听端口 80 并将所有请求转发到我的应用程序上的端口 8088。然后,应用程序会发送一个 301 Moved Permanently 响应,重定向到相同的 URL,但会剥离所有端口并附加“https://”。这会导致客户端通过 HTTPS 重新请求 URL。

当我在本地测试它时它工作正常,但是当我将它部署到弹性负载均衡器后面的 EC2 时,我得到 502 Bad Gateway 回来了。服务器正在接收请求并且似乎正在正确发送重定向(正如我所说,当我直接访问服务器时它可以工作,而不是通过负载平衡器)。

4

1 回答 1

4

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

例如。如果我在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

于 2013-08-01T08:29:43.400 回答