Почему 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-адрес сервера, так как это тот, который делает запрос, а не пользователь.