
Request.RemoteAddr
我有一個簡單的 go 服務,它使用標準檢查請求 IP 位址網路/http套件。
該 go 服務部署在 nginx 後面,具有以下簡單的位置配置:
location /api {
proxy_pass http://localhost:8080;
}
顯然,當應用程式部署在代理程式後面時,Request.RemoteAddr
現在會返回本地主機/伺服器位址(例如::1
)
我知道我可以定義如下內容:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
但這樣做還需要修改 go 服務(以及一些額外的安全檢查,以防服務部署為獨立伺服器,因為這些標頭可以由客戶端修改)
有沒有辦法將請求遠端位址傳遞給 go 服務,以便可以傳回它Request.RemoteAddr
?
附註:例如,在這種情況下,在帶有 fastcgi 的 php 中,我可以執行以下操作:
fastcgi_param REMOTE_ADDR $remote_address;
答案1
您已建議對 Web 伺服器進行正確的設定變更。這些標頭通常是真實 IP 位址從 Web 伺服器傳遞到應用程式伺服器的方式,無論語言為何。您應該將它們添加到您的server
或location
區塊中。
然後要在 Go 中接收此數據,您可以使用中間件,例如代理頭來自 gorilla/handlers,它將把這些標頭之一的 IP 位址插入到Request.RemoteAddr
.您可以使用其他方法,但應該在 Stack Overflow 上詢問程式設計問題。
答案2
由於相關的 Go 庫是開源的,所以檢查起來非常簡單,不,不可能輕鬆自訂Request.RemoteAddr
。
你可以擺脫 nginx 並將你的 go 服務放在 api.example.com (一個單獨的未代理的公共 IP 位址)下,而不是 example.com/api 下。