2009-04-17 3 views
31

Мы используем ProxyPass для перенаправления всех «/ г» запросов JBoss на порт 18080 следующим образом:апач ProxyPass: как сохранить оригинальный IP-адрес

ProxyPreserveHost on 
ProxyPass /r http://localhost:18080/redirectService/ 
ProxyPassReverse /r http://localhost:18080/redirectService/ 

Но, что приводит к тому, IP-адресу авторизован доступ сервера JBoss log как "127.0.0.1". Кто-нибудь знает, как мы можем сохранить исходный IP-адрес, с которого запрос пришел в HttpServletRequest? Мы хотим получить его от запроса сервлета jboss в doGet()

ответ

25

Вы можете получить исходный хост из поля заголовка X-Forwarded-For.

+28

Это не совсем ответ вопрос. Имеет ли это? – cherouvim

+0

Ответ JasonW должен быть принятым IMO. –

+1

На самом деле, если вы используете последний Apache, ответ Steffen должен быть принят. – Brean

9

Если у вас есть возможность сделать это, я бы рекомендовал использовать mod-jk или mod-proxy-ajp для передачи запросов от Apache в JBoss. Протокол AJP намного эффективнее по сравнению с использованием запросов HTTP-прокси, и в качестве преимущества JBoss увидит запрос как исходящий от исходного клиента, а не Apache.

12

Это более элегантное объяснение и несколько возможных решений. http://kasunh.wordpress.com/2011/10/11/preserving-remote-iphost-while-proxying/

В статье описано, как использовать один популярный и один менее известный модуль Apache для сохранения host/ip во время установки с использованием проксирования.

Используйте модуль mod_rpaf, установите и включите его на серверном сервере и добавьте следующие директивы в конфигурацию модуля. RPAFenable На
RPAFsethostname На
RPAFproxy_ips 127.0.0.1

(+2017) редактировать текущее местоположение mod_rpaf: https://github.com/gnif/mod_rpaf

+4

Лучше, если вы на самом деле суммируете, о чем идет ссылка, и/или цитируете наиболее значимую часть. В противном случае это просто похоже, что вы спам. – random

+0

RPAF также может обмануть сайт, думая, что к нему обращаются через HTTPS, для ssl-терминальных прокси. –

21

Ответ JasonW прекрасно. Но с тех пор, Apache HTTPD 2.4.6 есть альтернатива: mod_remoteip

Все, что вы должны сделать, это:

  1. Может быть, вы должны установить пакет mod_remoteip
  2. Включить модуль:

    LoadModule remoteip_module modules/mod_remoteip.so 
    
  3. Добавьте следующее в конфигурацию apache httpd. Обратите внимание, что вы должны добавить эту строку не в конфигурацию прокси-сервера. Вы должны добавить это к конфигурации сервера HTTPd прокси целевой (сервер за прокси):

    RemoteIPHeader X-Forwarded-For 
    

Смотреть на http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html для получения дополнительной информации и дополнительных опций.

+1

Какую настройку вы описываете здесь? Это апач за другим апачем? Это применимо для jboss за Apache? –

+0

Да. Добавьте пакет mod_remoteip в apache за прокси-сервером. mod_remoteip заменяет IP-адрес прокси-сервера значением X-Forward-For, которое содержит исходный IP-адрес веб-клиента. – Steffen

0

Если вы используете обратный прокси-сервер Apache для обслуживания приложения, работающего на локальном хосте, вы должны добавить местоположение к вашему vhost.

<Location />    
    ProxyPass http://localhost:1339/ retry=0 
    ProxyPassReverse http://localhost:1339/ 
    ProxyPreserveHost On 
    ProxyErrorOverride Off 
</Location> 

Чтобы получить IP-адрес имеют следующие параметры

console.log(">>>", req.ip);// this works fine for me returned a valid ip address 
console.log(">>>", req.headers['x-forwarded-for']);// returned a valid IP address 
console.log(">>>", req.headers['X-Real-IP']); // did not work returned undefined 
console.log(">>>", req.connection.remoteAddress);// returned the loopback IP address 

Так как использование req.ip или req.headers [ 'х-пересылаются-за']

Смежные вопросы