基于 HTTPS/SSL 的 AWS ELB 背后的 Zuul

pho*_*360 5 spring amazon-web-services spring-hateoas spring-cloud netflix-zuul

我有一个 AWS Elastic Load Balancer,其中包含我的域的证书并终止SSL流量。该ELB有一个监听https端口,并转发为httpZuul

当我使用时Spring Boot HATEOAS,Zuul 将用正确的地址替换链接,http而不是https

"_links": {
  "self": {
    "href": "http://my.domain.com:80/rest/foo/bar"
  }
}
Run Code Online (Sandbox Code Playgroud)

但我想要的是:

"_links": {
  "self": {
    "href": "https://my.domain.com/rest/foo/bar"
  }
}
Run Code Online (Sandbox Code Playgroud)

生成此响应的请求已完成 https

因为Zuul在 ELB 后面,我猜它不知道它应该通过 https 接收流量。

有没有办法告诉Zuul替换链接,https即使它通过 接收未加密的流量http

我想另一种方法是使用自签名证书进行部署Zuulhttps但如果可以的话,我宁愿避免这种复杂情况。

pho*_*360 1

根据 Zuul 团队的建议,可以通过添加 Zuul 过滤器来解决此问题,并在(顺序 5)pre之后应用:PreDecorationFilter

new ZuulFilter() {
        @Override
        public String filterType() {
            return "pre";
        }

        @Override
        public int filterOrder() {
            return 6; //PreDecorationFilter=5 + 1
        }

        @Override
        public boolean shouldFilter() {
            return true;
        }

        @Override
        public Object run() {
            RequestContext ctx = RequestContext.getCurrentContext();
            log.info(String.format("Before filter ['%s': '%s', '%s': '%s']",
                    ZuulHeaders.X_FORWARDED_PROTO.toLowerCase(),
                    ctx.getZuulRequestHeaders().get(ZuulHeaders.X_FORWARDED_PROTO.toLowerCase()),
                    "X-Forwarded-Port",
                    ctx.getZuulRequestHeaders().get("x-forwarded-port")));


            final String originalXForwardedProto = ctx.getRequest().getHeader(ZuulHeaders.X_FORWARDED_PROTO.toLowerCase());
            final String originalXForwardedPort = ctx.getRequest().getHeader("x-forwarded-port");

            if (!StringUtils.isEmpty(originalXForwardedProto)) {
                ctx.addZuulRequestHeader(ZuulHeaders.X_FORWARDED_PROTO.toLowerCase(), originalXForwardedProto);
            }

            if (!StringUtils.isEmpty(originalXForwardedPort)) {
                ctx.addZuulRequestHeader("x-forwarded-port", originalXForwardedPort);
            }

            log.info(String.format("After filter ['%s': '%s', '%s': '%s']",
                    ZuulHeaders.X_FORWARDED_PROTO.toLowerCase(),
                    ctx.getZuulRequestHeaders().get(ZuulHeaders.X_FORWARDED_PROTO.toLowerCase()),
                    "X-Forwarded-Port",
                    ctx.getZuulRequestHeaders().get("x-forwarded-port")));

            return null;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)