
Eu tenho um serviço simples que verifica o endereço IP da solicitação usando Request.RemoteAddr
o padrãopacote net/http.
Este serviço go é implantado atrás do nginx com a seguinte configuração de localização simples:
location /api {
proxy_pass http://localhost:8080;
}
Obviamente, quando o aplicativo é implantado atrás do proxy, Request.RemoteAddr
agora retorna o endereço localhost/servidor (por exemplo, ::1
)
Eu sei que poderia definir algo como:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
mas isso também exigirá modificações no serviço go (e algumas verificações de segurança adicionais caso o serviço seja implantado como um servidor independente, porque esses cabeçalhos podem ser modificados pelo cliente)
Existe uma maneira de passar o endereço remoto da solicitação para o serviço go, para que ele possa ser retornado por Request.RemoteAddr
?
Nota lateral: Em php com fastcgi, neste caso, por exemplo, eu poderia fazer algo como:
fastcgi_param REMOTE_ADDR $remote_address;
Responder1
Você propôs as alterações corretas na configuração do seu servidor web. Esses cabeçalhos são como o endereço IP real geralmente é passado do servidor web para o servidor de aplicativos, independentemente do idioma. Você deve adicioná-los ao seu bloco server
ou location
.
Então, para receber esses dados em Go, você pode usar um middleware comoCabeçalhos proxyde gorilla/handlers, que inserirá o endereço IP de um desses cabeçalhos em Request.RemoteAddr
. Você poderia usar outras abordagens, mas perguntas de programação devem ser feitas no Stack Overflow.
Responder2
Como as bibliotecas Go relevantes são de código aberto, foi bastante simples verificar que não, não há possibilidade de personalizar facilmente o Request.RemoteAddr
.
Você pode se livrar do nginx e colocar seu serviço go em api.example.com (um endereço IP público sem proxy separado) em vez de example.com/api.