2016-04-30 4 views
1

Мой сервер обрабатывает несколько веб-сайтов, большинство из них с Apache, PHP и т.д.Apache + Python Bottle: посетитель IP всегда относится к 127.0.0.1

Но один из них (www.mywebsite.com) использует Python веб-сервер, который прослушивает на порт 8092. Таким образом, эта конфигурация Apache:

<VirtualHost *:80> 
    ServerName mywebsite.com 
    ServerAlias *.mywebsite.com 
    RewriteEngine On 
    RewriteRule /(.*)   http://localhost:8092/$1 [P,L] 
</VirtualHost> 

Теперь, когда пользователь, выходя из интернета, подключается к www.mywebsite.com, он работает: Python обрабатывает его и все в порядке.

Проблема: IP, что я получаю в моем коде Python с помощью bottle с:

ip = request.environ.get('REMOTE_ADDR') 

является всегда 127.0.0.1.

Как получить реальный IP-адрес посетителя вместо этого?

ответ

2

Ваш виртуальный хост использует proxy rewriting. Клиент подключается к apache, который открывает прокси-соединение с вашим приложением, переписывает URL-адрес и проксирует запрос. Между вашим приложением и клиентом нет реальной связи.

Поскольку между вашим приложением и клиентом нет прямой связи, вы не можете получить «реальный IP», если вы не сообщите Apache о его отправке в ваше приложение. Обычный подход - установить что-то вроде заголовка X-Forwarded-For. Возможно, вам придется явно использовать mod_proxy.

+0

Вы правы, 'request.environ.get ('HTTP_X_FORWARDED_FOR')' отлично работает. – Basj