在Zuul代理的背后,Spring重定向url问题

我一直试图在过去的两天内遇到一个奇怪的重定向问题,但没有成功。

基于spring-cloud示例项目,我配置了Eureka,Zuul和Zuul后面的基本服务。

我有以下方法;

@RequestMapping(method = RequestMethod.POST, value = "/register")
public String registerDevice(Principal principal, String response) {
  // ...
  return "redirect:/account";
}

表单被设置为发布到代理URL,如下所示;

POST https://localhost:8443/service/register

(Zuul在localhost上运行:8443)。

本地服务(非代理)的URL将是; HTTP://本地主机:9001 /寄存器

POST调用通过上述方法正确代理,但发送到浏览器的重定向位置是服务的非代理URL; HTTP://本地主机:9001 /帐户

Zuul代理肯定会发送正确的x-forwarded- *标题,所以我期望Spring中的视图解析器能够基于x转发的值构建正确的重定向。

为了证明标题发送正确,我重新配置了以下方法;

@RequestMapping(method = RequestMethod.POST, value = "/register")
public void registerDevice(Principal, String response, HttpServletResponse response) {
  // ...
  String rUrl = ServletUriComponentsBuilder.fromCurrentContextPath().path("/account").build().toUriString();
  servletResponse.sendRedirect(rUrl);
}

哪些将浏览器正确重定向到代理位置; https://开头本地主机:8443 /服务/帐户

这是一个错误,还是它的预期行为? 我认为使用“重定向:”是为了兑现从代理传递的前向标头。


正如你所看到的, RedirectView忽略了X-FORWARDED-*头文件。 简而言之,您不能使用“ redirect:/account"

而是实例化一个RedirectView并相应地进行配置:

RedirectView redirect = new RedirectView("account");
redirect.setHosts(new String[]{ request.getHeader("X-FORWARDED-HOST") });

由于Spring Framework 4.3(现在是RC1) setHosts方法可用。


如果您在后端应用程序中使用tomcat作为嵌入式服务器,则可以使用此设置(application.properties,yml等):

server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto

或者更通用的方式:

server.use-forward-headers=true
链接地址: http://www.djcxy.com/p/32177.html

上一篇: Spring redirect url issue when behind Zuul proxy

下一篇: PostGis clustering with other aggregate