【问题标题】:AWS EC2 redirect HTTP to HTTPS trough load balancerAWS EC2 通过负载均衡器将 HTTP 重定向到 HTTPS
【发布时间】:2017-02-19 04:27:21
【问题描述】:

我正在尝试在我的应用程序中实现 HTTPS。这是一个运行在 8080 端口上的 JHipster/SpringBoot 应用程序。我通过 AWS 实现了 HTTPS,以使事情变得更容易,因为证书可以由 AWS 证书管理器服务自动处理/更新。

所以我没有更改服务器上的任何内容。我在 AWS 上生成了一个证书,并配置了一个 LoadBalancer 规则,以使用生成的证书从 443 重定向到 8080。当我尝试使用显式 HTTPS 访问我的域时,它就像一个魅力。

问题是我也想将HTTP访问重定向到HTTPS,然后我尝试添加一个规则将80重定向到443,所以它会落在第一个规则(443到8080)并使用证书,但是它不起作用。在线研究我发现我应该在我的 .htacess 文件中添加一些行,但也不起作用。我认为这不是我的解决方案,因为所有 HTTPS 的东西都在 AWS 端,有没有办法仅通过 AWS 将 HTTP 重定向到 HTTPS 而无需更改我的服务器?

【问题讨论】:

    标签: amazon-web-services https spring-boot elastic-load-balancer aws-certificate-manager


    【解决方案1】:

    上面的答案对我不起作用,因为我没有使用这样的文件。我最终做了一个这样的后端过滤器:

    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class HttpToHttpsFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        @Override
        public void destroy() {
            // Nothing to destroy
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            HttpServletResponse httpResponse = (HttpServletResponse) response;
    
            String protocol = httpRequest.getHeader("X-Forwarded-Proto");
            if (protocol != null) {
                if(protocol.toLowerCase().equals("https")) {
                    httpResponse.setHeader("Strict-Transport-Security", "max-age=60");
                }
                else if(protocol.toLowerCase().equals("http")) {
                    String host = httpRequest.getServerName();
                    String requestURI = httpRequest.getRequestURI();
                    String redirectUrl = "https://" + host + requestURI;
                    httpResponse.sendRedirect(redirectUrl);
                    return;
                }
            }
    
            chain.doFilter(request, response);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您需要将到 HTTPS 重定向的 HTTP 流量也视为应用程序的一部分,并适应必要的规则和配置。

      例如,您将首先为 PORT 80 (HTTP) 打开 ELB,这将由侦听 80 或任何端口的 Web 服务器处理以执行重定向 [单独的侦听器]

      如果您使用的是 Apache Web 服务器,则需要类似的规则

      <VirtualHost *:80>
      ...
      RewriteEngine On
      RewriteCond %{HTTP:X-Forwarded-Proto} !https
      RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
      ...
      </VirtualHost>
      

      参考:

      1. http://www.emind.co/how-to/how-to-force-https-behind-aws-elb/
      2. Rerouting all http traffic to https with AWS ELB

      【讨论】:

        猜你喜欢
        • 2015-03-18
        • 2015-11-13
        • 2014-08-27
        • 2020-08-21
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        相关资源
        最近更新 更多