Есть ли способ собирать IP-адрес клиента, подключенного к вашему веб-сайту, через прокси-сервер?
Вся настройка – это внутренняя локальная сеть и через sysadmin, у меня есть контроль над прокси-машиной. Я использую PHP5 для сервера сайта.
Я пробовал $_SERVER['REMOTE_ADDR']
в PHP, но эта переменная просто хранит IP-адрес прокси-сервера.
Есть идеи?
Стандартное решение (в php):
if ($_SERVER['HTTP_X_FORWARDED_FOR']){ $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else{ $ip = $_SERVER['REMOTE_ADDR']; }
Но, как говорится в первом ответе, все это зависит от того, какой заголовок действительно установлен.
Это зависит от прокси. Некоторые прокси добавляют заголовок, который дает исходный IP-адрес, заголовок X-Forwarded-For, но при условии, что большинство компаний используют прокси, чтобы скрыть внутреннюю структуру сети, которая редко встречается. Если это так, то вы не сможете сделать это легко.
Если у вас есть контроль над прокси-сервером, пришло время прочитать документацию прокси, чтобы узнать, как добавить этот заголовок.
X-Forwarded-For
– единственный способ получить IP-адрес клиента. Проверьте, есть ли способ включить это в свой прокси-сервер.
На каком-то прокси-сервере он дает вам возможность обрабатывать существующий заголовок XFF (когда запрос проходит через несколько прокси-серверов). Вот что вам нужно учитывать,
Этот код можно использовать для получения IP-адреса клиента, который подключается через прокси-сервер.
public static String getClientIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; }
Но он обнаруживает только тогда, когда прокси прозрачен.
Ниже приведена информация о HTTP-прокси:
Не использовать прокси-сервер:
request.getRemoteAddr()
= IP-адрес клиента request.getHeader("HTTP_X_FORWARDED_FOR")
= Нет значения или Нет отображения Использовать прозрачные прокси:
HTTP_X_FORWARDED_FOR
= Реальный IP-адрес клиента Использовать обычные анонимные прокси:
request.getRemoteAddr()
= IP-адрес прокси-сервера HTTP_X_FORWARDED_FOR
= IP-адрес прокси-сервера