Переглядаючи http.Request, ви можете знайти такі змінні члени:
Header Header
RemoteAddr string
Ви можете використовувати RemoteAddr
IP-адресу та порт віддаленого клієнта (формат "IP: порт"), що є адресою оригінального запитувача або останнього проксі-сервера (наприклад, балансувальника навантаження, який живе перед вашим сервером).
Це все, що у вас є напевно.
Потім ви можете дослідити заголовки, які не враховують регістр (згідно з документацією вище), тобто всі ваші приклади працюватимуть і дадуть однаковий результат:
req.Header.Get("X-Forwarded-For")
req.Header.Get("x-forwarded-for")
req.Header.Get("X-FORWARDED-FOR")
Це тому, що внутрішньо http.Header.Get
нормалізує ключ для вас. (Якщо ви хочете отримати доступ до карти заголовків безпосередньо, а не через Get
, вам спочатку потрібно буде використовувати http.CanonicalHeaderKey .)
Нарешті, "X-Forwarded-For"
це, мабуть, те поле, яке ви хочете поглянути, щоб отримати більше інформації про IP клієнта. Це дуже залежить від програмного забезпечення HTTP, яке використовується на віддаленій стороні, оскільки клієнт може помістити туди все, що завгодно. Крім того, зверніть увагу, що очікуваний формат цього поля - це розділений комами + пробіл список IP-адрес. Вам потрібно буде проаналізувати його трохи, щоб отримати один обраний вами IP (можливо, перший у списку), наприклад:
ips := strings.Split("10.0.0.1, 10.0.0.2, 10.0.0.3", ", ")
for _, ip := range ips {
fmt.Println(ip)
}
буде виробляти:
10.0.0.1
10.0.0.2
10.0.0.3
req.Header
, вам потрібно лише зробитиreq.Header.Get("X-Forwarded-For")
, оскільки інші випадки аналізуються канонічно на це парсером.