2009-11-22 2 views
2

У меня есть приложение, работающее с debug = True на удаленном узле где-то. Теперь как-то каждый раз, когда я обращаюсь к REMOTE_ADDR, он возвращает 127.0.0.1 независимо от того, откуда отправляется запрос.Django: request.META ['REMOTE_ADDR'] всегда '127.0.0.1'

Я не уверен, с чего начать и почему это происходит.

ответ

6

У вас есть какой-либо прокси-сервер, шлюз или балансировщик нагрузки, работающий на этом удаленном хосте? Это то, что может привести к появлению соединений от 127.0.0.1 (потому что здесь непосредственное соединение равно, поскольку это касается веб-сервера).

+5

Для дальнейшего это, вы можете проверить, если X-Forwarded-For заголовок HTTP присутствует, это должно содержать IP вы хотите. – Lepidosteus

+1

Вы должны быть осторожны, полагаясь на X-Forwarded-For, это легко подделать. На самом деле у Django было промежуточное ПО, которое автоматически устанавливало REMOTE_ADDR на основе X-Forwarded-For, но удаляло его, потому что соблазняло людей полагаться на ненадежную. –

+0

«Легко подделано» вредно. В этом заголовке нет ничего особенного: он похож на любой другой HTTP-заголовок. Если сервер находится за прокси-сервером, почти на 100% уверен, что прокси-сервер удалит существующие заголовки X-Forwarded-For, прежде чем заменять их соответствующими значениями. Однако, если сервер не находится за прокси-сервером, использование заголовков X-Forwarded-For бесполезно, поскольку пользователь может вручную установить этот заголовок. В любом случае, при использовании безопасности на основе IP (рискованно) вы никогда не должны доверять подключениям от прокси. – sleblanc

0

Если вы находитесь за прокси и используете apache в качестве веб-сервера, вы можете использовать mod_rpaf. Прокси-серверу необходимо отправлять только заголовки X-Forwarded-For или X-Real-IP.

http://stderr.net/apache/rpaf/