Почему ServerVariable [ "REMOTE_ADDR" ] возвращает IP-адрес сервера?

У меня есть следующий код:

string ip = Request.ServerVariables["REMOTE_ADDR"];

Что в тестовой среде возвращает пользовательский IP-адрес, но при развертывании веб-сайта для производства эта переменная имеет IP-адрес сервера, на котором размещено приложение. Любая помощь?

Ответ 1

Я предполагаю, что в середине есть прокси. Сначала используйте HTTP_X_FORWARDED_FOR, и если это значение null, используйте REMOTE_ADDR

Из статьи MSDN:

Хотя получить только переменную сервера REMOTE_ADDR должно быть достаточно, я нашел ресурсы в Интернете, которые предположили, что такой код должен также проверять переменную HTTP_X_FORWARDED_FOR; если запрос приходит через прокси-сервер, который переводит адрес, то эта переменная содержит правильный адрес. Если вы запрашиваете переменную сервера, которая не существует, свойство ServerVariables возвращает пустую строку. Поэтому, хотя это свойство не появляется в моих тестах, попытка получить его значение не вызывает проблем.

UPDATE:

Если у вас есть настройки балансировки нагрузки, которые у вас установлены, вы должны спросить, могут ли они пройти IP-адрес отправления. Я знаю, что это можно сделать с сервером Microsoft ISA.

Если это не вариант, есть и другие переменные сервера, которые вы можете попробовать и посмотреть, создают ли они результат:

"HTTP_X_COMING_FROM"
"HTTP_X_FORWARDED_FOR"
"HTTP_X_FORWARDED"
"HTTP_X_REAL_IP"
"HTTP_VIA"
"HTTP_COMING_FROM"
"HTTP_FORWARDED_FOR"
"HTTP_FORWARDED"
"HTTP_FROM"
"HTTP_PROXY_CONNECTION"
"CLIENT_IP"
"FORWARDED"

Ответ 2

Почему вы используете старые серверные переменные типа VB вместо Request.UserHostAddress?

См. Библиотека MSDN.

Как заявили другие, вы получите IP-адрес обратного прокси-сервера/SSL-терминатора, если он не сделает запросы похожими на исходный клиент (как это возможно, по крайней мере, на ISA-сервере и, возможно, в большинстве других обратных прокси).

Если нет, вы получите общедоступный адрес клиента (который, вероятно, является адресом маршрутизатора на клиентском сайте, так как большинство локальных сетей NAT-ed).

Как ваша настройка в рабочей среде отличается от вашей тестовой среды?

Действительно ли вы получаете IP-адрес веб-сервера или какого-либо другого сервера в одной сети?

Ответ 3

Я вижу, что это старый вопрос, но я наткнулся на него, и я думаю, что знаю ответ. Ответ прост, чем выше... Я просто столкнулся с тем же вопросом сегодня. Бьюсь об заклад, вы пытаетесь получить IP-адрес от страницы, вызываемой XMLHTTP, которая вернет IP-адрес сервера, так как это тот, который делает запрос, а не пользователь.