2013-06-20 1 views

ответ

26

внутри функции обработчика позвонить r.RemoteAddr получить IP: порт

так:

func renderIndexPage(w http.ResponseWriter, r *http.Request) { 
    ip := strings.Split(r.RemoteAddr,":")[0] 

} 

обновление 02/15/2017 , как @Aigars Matulis указал, в текущей версии есть уже функция TODO это

ip, _, _ := net.SplitHostPort(r.RemoteAddr) 
+0

+1 Для полноты, я был вопрос, как я использовал Localhost в моей ссылке. см. обсуждение здесь. https://groups.google.com/forum/#!topic/golang-nuts/rqo1--qR-8Y – bsr

+1

yes localhost всегда особенный, и я предполагаю, что вы используете mac, который разрешает ipv6, что вызывает проблемы с localhost и ip начиная с лет –

+1

Добавьте конец, что сработало для меня, было просто использовать «r.RemoteAddr». –

46

Использование net.SplitHostPort:

ip, _, _ := net.SplitHostPort(r.RemoteAddr) 
+1

http://golang.org/pkg/net/#SplitHostPort – Xeoncross

+3

Не забудьте «импортировать» сеть »' – styler1972

+0

+1, отличный ответ. Лучше повторно использовать код, чем разбить вручную. –

24

Ответы выше пренебрегают проверкой того, пересылается ли IP-адрес пользователя прокси-сервером. Во многих случаях IP-адрес, который вы найдете в RemoteAddr, является IP-адресом прокси-сервера, который перенаправляет вам запрос пользователя, а не IP-адрес пользователя!

Более точное решение будет выглядеть следующим образом:

package main 

import (
    "net" 
    "net/http" 
) 

func GetIP(r *http.Request) string { 
    if ipProxy := r.Header.Get("X-FORWARDED-FOR"); len(ipProxy) > 0 { 
     return ipProxy 
    } 
    ip, _, _ := net.SplitHostPort(r.RemoteAddr) 
    return ip 
} 
+4

Этот ответ предполагает, что X-Forwarded-For может быть списком: http://stackoverflow.com/a/27235620/214070 – bugloaf

+1

@orcaman это действительно так, если запрос передается через несколько прокси, например, в Elastic Load Balancer в AWS, контент будет списком IP-адресов. самый левый ip должен быть IP-адресом клиента. Дополнительную информацию вы можете найти здесь http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/x-forwarded-headers.html#x-forwarded-for –

+0

При регистрации IP-адреса. Обязательно зарегистрируйте как RemoteAddr, так и X-Forwarded-For. Причина? Хакер всегда может установить заголовок X-Forwarded-For ;-). С другой стороны. Хакер, скорее всего, будет использовать TOR или другой способ скрыть свой IP-адрес. –

0

Это работает для меня. Я бегу идти в 8081 и сделал запрос от порта 8080.

fmt.Printf("r: %+v\n", r) // Print all fields that you get in request 

Выход:

г: & {Метод: POST URL:/электронная почта Proto: HTTP/1.1 ProtoMajor: 1 ProtoMinor: 1 Header: map [User-Agent: [Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.11 (KHTML, например, Gecko) Версия/10.0.1 Safari/602.2.11] Accept-Language: [en- us] Accept-Encoding: [gzip, deflate] Connection: [keep-alive] Accept: [/] Referer: [http://127.0.0.1:8080/] Content-Length: [9] Content-Type: [application/x-www-form-urlencoded ; charset = UTF-8] Происхождение: [http://127.0.0.1:8080]] Тело: 0xc420012800 ContentLength: 9 TransferEncoding: [] Закрыть: false Хост: 127.0.0.1: 8081 Форма: map [] PostForm: map [] MultipartForm: Трейлер: map [] RemoteAddr: 127.0 .0.1: 62232 RequestURI:/email TLS: Отмена: ответ: ctx: 0xc420017860}

Референт и источник имеют мой IP-адрес клиента.

ip := r.Referer() // Get Referer value 
fmt.Println(ip) // print ip 

Выход:

http://127.0.0.1:8080/