2009-07-25 10 views
13

Obecnie mam ustawienie Tomcat + Apache HTTP Server, aby służyć mój aplet Java:ProxyPass, ProxyReverse vs AJP

ProxyPass /myservice http://localhost:8080/myservice 
ProxyPassRerverse /myservice http://localhost:8080/myservice 

to wszystko jest w porządku z wyjątkiem że myservice musi znać adres IP klienta, który zawsze okazuje się być 127.0.0.1 ze względu na proxy. Czy istnieje rozwiązanie pozwalające uzyskać prawdziwy adres IP? Czy AJP jest opcją?

doGet(HttpServletRequest request, HttpServletResponse response){ 
    request.getRemoteAddr() 
} 

Odpowiedz

19

Czy to tak:

w apache config:

<Location /foo> 
    ProxyPass ajp://localhost:8009/foo 
    ProxyPassReverse ajp://localhost:8009/foo 
</Location> 

a następnie w server.xml:

<Connector port="8009" 
      enableLookups="false" secure="true" URIEncoding="UTF-8" 
      tomcatAuthentication="false" 
      protocol="AJP/1.3" /> 

To powinno przejść przez wszystko. Protokół AJP przekazuje informacje, ale http: nie.

Możesz nie chcieć bezpiecznego = "prawda", używam tego, ponieważ SSL jest obsługiwane w warstwie apache i potrzebuję, aby tomcat wiedział, że połączenie powinno być uważane za bezpieczne.

+1

Mam klienta zaprzeczył konfiguracji serwera: Proxy: AJP: //127.0.0.1: 8009 błąd/tomcat w error.log Musiałem zmienić ustawienie Proxy * z Deny all na Deny none w /etc/apache2/mods-enabled/proxy.conf Po prostu wspomniałem o tym dla przyszłych wyszukiwań. – KishoreK

+0

To bardzo mi pomogło. Byłem idiotą i wstawiłem 'http' zamiast' ajp' ... LOL! – cbmeeks

+5

Należy rozważyć modyfikację ustawienia ProxyPassReverse, ponieważ wydaje się, że jest to powszechny błąd zgodnie z http://www.humboldt.co.uk/2009/02/the-mystery-of-proxypassreverse.html – Jack

1

to jest bardzo proste:

<VirtualHost> 

ServerName www.server.com 

redirect/http://www.server.com/foo 

ProxyRequests off 
ProxyPass/ajp://localhost:8009/ 

</VirtualHost> 
3

Można odczytać X-Przekazano-FOR w nagłówku żądania.

Z Apache mod_proxy documentation:

Działając w trybie odwrotnym proxy (za pomocą dyrektywy ProxyPass, na przykład), mod_proxy_http dodaje kilka nagłówków żądania w celu przekazania informacji do serwera pochodzenia. Nagłówki te są następujące:

  • X-Przekazano-For: adres IP klienta.
  • X-Forwarded-Host: Oryginalny host żądany przez klienta w nagłówku żądania HTTP Hosta.
  • X-Forwarded-Server: Nazwa hosta serwera proxy.

Należy zachować ostrożność podczas korzystania z tych nagłówków na serwerze pochodzenia, ponieważ będą one zawierać więcej niż jedną wartość (oddzielonych przecinkami) jeżeli pierwotne żądanie zawarte już jeden z tych nagłówków. Na przykład możesz użyć% {X-Forwarded-For} i w ciągu znaków logu serwera początkowego, aby zarejestrować adres IP oryginalnego klienta, ale możesz otrzymać więcej niż jeden adres, jeśli żądanie przechodzi przez kilka serwerów proxy.

W swojej serwletu, to masz:

doGet(HttpServletRequest request, HttpServletResponse response){ 
    request.getHeader("X-Forwarded-For") 
} 
+0

Uwaga: 'X-Forwarded_For' vs' X-Forwarded-For' ... Kopiowanie-wklejanie kodu może być niebezpieczne :) –

Powiązane problemy