6

Próbuję dotrzeć do sedna dziwnego problemu przekierowania przez ostatnie 2 dni bez powodzenia.Wiosenny adres URL przekierowania, gdy za proxy Zuul

Na podstawie przykładowych projektów wiosenno-chmurowych skonfigurowałem Eureka, Zuul i podstawową usługę, która działa za Zuul.

Mam następujące metody;

Formularz jest skonfigurowany tak, aby publikować na serwerze proxy w następujący sposób;

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

(Zuul działa na localhost: 8443).

Adres URL usługi lokalnej (nieskonsolidowanej) byłby; http://localhost:9001/register

Wywołanie POST jest poprawnie skonfigurowane zgodnie z powyższą metodą, jednak lokalizacja przekierowania wysłana do przeglądarki jest nie-pośrednim adresem URL usługi; http://localhost:9001/account

Zuul proxy jest zdecydowanie wysyłania poprawnych x-forwarded- * nagłówki, więc spodziewam rezolwer widok na wiosnę budować poprawne przekierowanie oparte na wartościach X-przekazane.

Aby dowieść, że nagłówki zostały wysłane poprawnie, ponownie skonfigurowałem metodę w następujący sposób;

@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); 
} 

Która poprawnie przekierowuje przeglądarkę do lokalizacji pośredniej; https://localhost:8443/service/account

Czy to błąd, czy może oczekiwane zachowanie? Myślałem, że użycie "przekierowania" ma na celu uhonorowanie nagłówków przekazywanych z serwera proxy.

+0

Czy znaleźli rozwiązanie tego problemu? –

Odpowiedz

2

Jak widać RedirectView ignoruje nagłówki X-FORWARDED-*. Po prostu, nie można używać "redirect:/account"

Zamiast instancji RedirectView i skonfigurować go odpowiednio:..

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

Od Spring Framework 4.3 (obecnie RC1) setHosts metoda jest dostępna

+0

Mam ten sam problem i nie widzę setHosts() w najnowszej wersji RedirectView (v4.2.5) –

+0

@ damien-drugato masz rację! Metoda 'setHosts' została dodana w Spring Framework 4.3. Zaktualizowałem swoją odpowiedź. Dzięki. –

+0

dzięki, moje pytanie z tym samym problemem tutaj, jeśli masz jakąkolwiek wskazówkę: http://stackoverflow.com/questions/36881835/spring-mvc-web-app-behind-zuul-redirect-issue –

1

Jeśli używasz tomcat jako osadzonego serwera w aplikacji backendowej, możesz użyć tych ustawień (application.properties, yml, itp.):

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

Albo bardziej ogólny sposób:

server.use-forward-headers=true