Spring 通过HTTPS/SSL的AWS ELB背后的Zuul

Spring 通过HTTPS/SSL的AWS ELB背后的Zuul,spring,amazon-web-services,spring-cloud,spring-hateoas,netflix-zuul,Spring,Amazon Web Services,Spring Cloud,Spring Hateoas,Netflix Zuul,我有一个AWSElastic负载平衡器,带有我所在域的证书,可以终止SSL流量。ELB在https端口上有一个侦听器,并将其作为http转发到Zuul 当我使用Spring-Boot-HATEOAS时,Zuul将用正确的地址替换链接,但用http代替https: "_links": { "self": { "href": "http://my.domain.com:80/rest/foo/bar" } } 但我想要的是: "_links": { "self": {

我有一个AWS
Elastic负载平衡器
,带有我所在域的证书,可以终止
SSL
流量。
ELB
https
端口上有一个侦听器,并将其作为
http
转发到
Zuul

当我使用
Spring-Boot-HATEOAS
时,Zuul将用正确的地址替换链接,但用
http
代替
https

"_links": {
  "self": {
    "href": "http://my.domain.com:80/rest/foo/bar"
  }
}
但我想要的是:

"_links": {
  "self": {
    "href": "https://my.domain.com/rest/foo/bar"
  }
}
生成此响应的请求是通过
https

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

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


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

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

看见
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;
        }
    };
}