2009-07-25 2 views
13

Я в настоящее время установки сервера Tomcat + Apache HTTP служить мой Java-сервлет:ProxyPass, ProxyReverse против ОЮЛ

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

Это все хорошо, за исключением того, что myservice необходимо знать IP-адрес клиента, который всегда оказывается должен быть 127.0.0.1 из-за прокси. Есть ли решение для получения реального IP-адреса? Является ли AJP опцией?

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

ответ

19

Делают это так:

в апача конфигурации:

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

И тогда в вашем server.xml:

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

Это должно пройти все до конца. Протокол AJP передает информацию, но http: нет.

Возможно, вам не требуется secure = "true", я использую это, потому что SSL обрабатывается на уровне apache, и мне нужно, чтобы tomcat знал, что соединение должно считаться безопасным.

+1

Я получил клиент отрицает конфигурации сервера: прокси: ОЮЛ: //127.0.0.1: 8009 ошибка/TOMCAT в error.log Мне пришлось изменить настройку Proxy * из «Запретить все», чтобы «Запретить» в «/etc/apache2/mods-enabled/proxy.conf» Просто упомянуть здесь о будущих поисках. – KishoreK

+0

Это очень помогло мне. Я был идиотом и ставил 'http' вместо' ajp' ... LOL! – cbmeeks

+5

Пожалуйста, подумайте о том, чтобы изменить настройку ProxyPassReverse, поскольку это, по-видимому, является распространенной ошибкой в ​​соответствии с http://www.humboldt.co.uk/2009/02/the-mystery-of-proxypassreverse.html – Jack

1

это очень просто:

<VirtualHost> 

ServerName www.server.com 

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

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

</VirtualHost> 
3

Вы можете прочитать X-Forwarded-For в заголовке запроса.

От Apache mod_proxy documentation:

Действуя в обратном режиме прокси (с помощью директивы PROXYPASS, например), mod_proxy_http добавляет несколько заголовков запроса, чтобы передать информацию на сервер происхождения. Эти заголовки:

  • X-Forwarded-For: IP-адрес клиента.
  • X-Forwarded-Host: Исходный хост, запрошенный клиентом в заголовке HTTP-запроса хоста.
  • X-Forwarded-Server: Имя хоста прокси-сервера.

Будьте осторожны при использовании этих заголовков на исходном сервере, так как они будут содержать более одного значения (с разделителями-запятыми), если исходный запрос уже содержит один из этих заголовков. Например, вы можете использовать% {X-Forwarded-For} i в строке формата журнала исходного сервера для регистрации IP-адреса первоначальных клиентов, но вы можете получить более одного адреса, если запрос проходит через несколько прокси.

В сервлет, вы бы:

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

Предостережение: 'X-Forwarded_For' против' X-Forwarded-For' ... Копирование вставки кода может быть опасным :) –