Apache ProxyPass:как сохранить оригинальный IP-адрес
Вопрос
Мы используем ProxyPass для перенаправления всех запросов «/r» на jboss через порт 18080 следующим образом:
ProxyPreserveHost on
ProxyPass /r http://localhost:18080/redirectService/
ProxyPassReverse /r http://localhost:18080/redirectService/
Но это приводит к тому, что IP-адрес регистрируется в журнале доступа jboss как «127.0.0.1».Кто-нибудь знает, как мы можем сохранить исходный IP-адрес, откуда пришел запрос, в HttpServletRequest?Мы хотим получить к нему доступ из запроса сервлета jboss в doGet().
Решение
Вы можете получить исходный хост с X-Перенаправлено-Для поле заголовка.
Другие советы
Ответ JasonW в порядке.Но начиная с apache httpd 2.4.6 есть альтернатива:mod_remoteip
Все, что вам нужно сделать, это:
- Возможно, вам необходимо установить пакет mod_remoteip
Включите модуль:
LoadModule remoteip_module modules/mod_remoteip.so
Добавьте следующее в конфигурацию Apache httpd.Обратите внимание, что вы должны добавить эту строку нет в конфигурацию прокси-сервера.Вы должны добавьте это в конфигурацию целевого прокси-сервера httpd (сервер за прокси):
RemoteIPHeader X-Forwarded-For
См. на http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html для получения дополнительной информации и дополнительных возможностей.
Это имеет более элегантное объяснение и более чем одно возможное решение. http://kasunh.wordpress.com/2011/10/11/preserving-remote-iphost- while-proxying/
В посте описывается, как использовать один популярный и один менее известный модули Apache для сохранения хоста/IP при настройке, включающей проксирование.
Используйте модуль mod_rpaf, установите и включите его на внутреннем сервере и добавьте следующие директивы в конфигурацию модуля.RPAFenable Вкл.
RPAFsethostname Вкл.
RPAFproxy_ips 127.0.0.1
(редактирование 2017 г.) Текущее местоположение mod_rpaf: https://github.com/gnif/mod_rpaf
Если у вас есть такая возможность, я бы рекомендовал использовать либо мод-джк или мод-прокси-ajp для передачи запросов от Apache к JBoss.Протокол AJP намного более эффективен по сравнению с использованием запросов HTTP-прокси, и в качестве преимущества JBoss будет видеть, что запрос исходит от исходного клиента, а не от Apache.
Если вы используете обратный прокси-сервер Apache для обслуживания приложения, работающего на порту локального хоста, вам необходимо добавить местоположение на свой виртуальный хост.
<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['x-forwarded-for']