如何正確地將請求遠端位址轉送至代理的Go服務?

如何正確地將請求遠端位址轉送至代理的Go服務?

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 伺服器傳遞到應用程式伺服器的方式,無論語言為何。您應該將它們添加到您的serverlocation區塊中。

然後要在 Go 中接收此數據,您可以使用中間件,例如代理頭來自 gorilla/handlers,它將把這些標頭之一的 IP 位址插入到Request.RemoteAddr.您可以使用其他方法,但應該在 Stack Overflow 上詢問程式設計問題。

答案2

由於相關的 Go 庫是開源的,所以檢查起來非常簡單,不,不可能輕鬆自訂Request.RemoteAddr

你可以擺脫 nginx 並將你的 go 服務放在 api.example.com (一個單獨的未代理的公共 IP 位址)下,而不是 example.com/api 下。

相關內容