Как установить REMOTE_ADDR в apache до вызова php

У меня есть сайт, настроенный с nginx, действующий как обратный прокси для apache 2.2, на котором запущен php. С точки зрения apache и php IP-адрес всех запросов является сервером nginx. Я бы хотел, чтобы php увидел тот же удаленный IP-адрес, что и nginx.

Nginx устанавливает заголовок X-Real-IP, который содержит удаленный IP-адрес, который видит nginx. Я попытался сделать что-то подобное в apache conf:

SetEnvIf ^X-Real-IP$ "(.+)" REMOTE_ADDR=$1

Моя надежда заключалась в том, что я могу установить переменную среды REMOTE_ADDR, и когда php наконец вызывается, он увидит удаленный IP-адрес, который видит nginx. Я думаю, что php-код делает это:

$_SERVER['REMOTE_ADDR']

В любом случае, это не работает. Есть идеи? Не можете ли вы установить REMOTE_ADDR в конфигурационный файл apache? Спасибо.

Ответ 1

Не уверен, что REMOTE_ADDR можно изменить таким образом...


На самом деле вам может потребоваться установить/включить другой модуль Apache, например mod_rpaf (цитирование):

Он изменяет удаленный адрес клиент, видимый для других модулей Apache когда выполняются два условия.
Первое условие заключается в том, что удаленный клиент фактически является прокси-сервером, который определенном в httpd.conf. Во-вторых, если есть входящий X-Forwarded-For заголовок и прокси-сервер в списке известных прокси-серверов он занимает последний IP-адрес от входящего X-Forwarded-For заголовок и изменение удаленного адреса клиента в запросе состав.
Он также принимает входящего X-хоста и обновляет соответственно.
Для Apache2 mod_proxy требуется Заголовок X-Forwared-Host и обновляет VirtualHosts

Вот блог-сообщение об этом: Nginx proxy для Apache - доступ к удаленному IP-адресу хоста с помощью mod_praf

Обновление: исходная ссылка не работает прямо сейчас, но она также доступна как пакет debian: apt-get install libapache2-mod-rpaf

Ответ 2

Я решил это с помощью mod_remoteip для Apache. mod_remoteip для Apache 2.5, но благодаря этому парню вы можете использовать его и на Apache 2.2.x.

Загрузите mod_remoteip.c из https://gist.github.com/1042237 и скомпилируйте его с помощью

apxs -i -a -c mod_remoteip.c

Это должно создать копию mod_remoteip.so в каталоге модулей. apxs также добавит директиву LoadModule в ваш httpd.conf для вновь созданного модуля.

Откройте httpd.conf и проверьте, существует ли директива LoadModule для mod_remoteip

LoadModule remoteip_module    modules/mod_remoteip.so

Добавить директиву RemoteIPHeader в httpd.conf

RemoteIPHeader X-Forwarded-For

Эта директива будет давать команду mod_remoteip использовать значение X-Forwarded-For из nginx как remote_addr. Вместо этого вы можете использовать X-Real-IP:

RemoteIPHeader X-Real-IP

Перезапустите Apache. Если вы установили заголовки прокси-сервера в nginx, он будет работать как шарм, а remote_addr в Apache будет правильным.

# nginx conf    
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Ответ 3

Вы можете попробовать этот простой PHP-модуль

https://github.com/yohgaki/realip

Он просто перезаписывает $_SERVER ['REMOTE_ADDR'] с X-Forwarded-For или X-Real-IP любым заголовком, который вам нравится. Вы можете сделать это со многими разными способами, но я просто хотел бы сделать это как PHP-модуль. Поэтому я написал это.

Ответ 4

Я не знаю, можно ли манипулировать REMOTE_ADDR - возможно, это невозможно, но вы должны иметь возможность получить заголовок X-Real-IP в PHP через что-то вроде

$_ SERVER [ "HTTP_X_Real_IP" ]

или аналогичный - отметьте phpinfo() для правильной нотации.

Кроме того, переменные окружения Apache, установленные в .htaccess, должны быть видны в PHP.

Ответ 5

Apache (требуется модуль mod_headers):

SetEnvIf X-Real-IP "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFF_CLIENT_IP=$1
RequestHeader set REMOTE_ADDR %{XFF_CLIENT_IP}e

REF для SetEnvIf RegEx: fooobar.com/questions/464386/...

Работает также, но не проверяет ввод как IP:

SetEnvIf X-Real-IP "^(.*)" XFF_CLIENT_IP=$1
RequestHeader set REMOTE_ADDR %{XFF_CLIENT_IP}e

В PHP:

$_SERVER["HTTP_REMOTE_ADDR"]

-или -

$_SERVER["REMOTE_ADDR"]

Не требуются неядерные модули Apache

Ответ 6

mod_rpaf (sudo apt-get install libapache2-mod-rpaf)

разрешил все проблемы, и REMOTE_ADDRR теперь выглядит нормально!..

Ответ 7

Выложите манжету... но можете ли вы передать заголовок X-Real-IP в качестве переменной на php, используя некоторую магию перезаписи..? Не может htaccess делать материал с информацией заголовка, прежде чем он вызывает PHP?

Ответ 8

Вероятно, вы хотите использовать это на самом деле: http://httpd.apache.org/docs/2.3/mod/mod_remoteip.html. Обладает множеством функций и поддерживается самими апачами.

Изменить: я имел в виду предложение mod_rpaf выше.