我將 NGINX 作為 Docker 包的一部分運行。它既是網路服務器又是反向代理,并且容器中捆綁了 PHP。前端 Web 應用程式是使用 Laravel 構建的。在某些情況下,我想獲取客戶端的 IP 地址,這在某些情況下似乎有點問題。這不是針對代理的,而是針對使用 NGINX 和 PHP 服務的 Web 應用程式。
在我家里的開發系統上,當我從本地機器上連接瀏覽器時,我得到了一個 docker 網路的 IP。
$_SERVER['SERVER_ADDR'] = 172.19.0.10
$_SERVER['REMOTE_ADDR'] = 172.19.0.1
在 Digital Ocean Dev 服務器上,它具有:
$_SERVER['SERVER_ADDR'] 172.27.0.16
$_SERVER['REMOTE_ADDR'] 213.225.x.xx, which is Austria, my IP
在其他地方的生產服務器上,我認為它具有:
$_SERVER['SERVER_ADDR'] ???
$_SERVER['REMOTE_ADDR'] = The WAN IP for the office where the server is installed.
這不是客戶端 IP,而是辦公室本身的 WAN 地址。
我認為該辦公室的服務器位于 WatchGuard 或 Fortigate 路由器/防火墻后面。
所以,Digital Ocean Dev 服務器其實是“OK”的。我可以訪問我需要的東西,但辦公室設定可能沒有設定為將客戶端 IP 轉發到在他們的互聯網上運行的服務器?
目前它并不重要,但在所有情況下都能捕獲到公共客戶端 IP 會很好。
我可以對日志檔案等進行更多調查,但我很確定我必須:
- 可能在我的 NGINX 配置中配置一些東西
和/或
- 讓某人配置防火墻以通過客戶端 IP,因為它目前似乎沒有這樣做,或者我沒有捕獲它正在發送的內容。
uj5u.com熱心網友回復:
可以將辦公室的 nginx 代理配置為使用該proxy_set_header指令傳遞客戶端的 IP 地址。
這里的 nginx反向代理檔案顯示了一個示例:
location /some/path/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8000;
}
在proxy_pass設定了反向代理指令的配置塊中,添加proxy_set_header X-Real-IP $remote_addr;告訴代理注入一個新的 HTTP 標頭,X-Real-IP,以及客戶端的 IP 地址。在 Laravel 應用程式中,您可以使用它來獲取實際的客戶端 IP。在您的應用程式中,確保僅在可以信任的情況下使用此標頭1。
這是必要的,因為代理正在通過代理服務器從其自己的網路地址接收并重新發送客戶端的請求。應用程式可以獲取被代理請求的原始客戶端 IP 的唯一方法是該 IP 地址是否由代理在標頭中傳遞。
1 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For#security_and_privacy_concerns
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/533205.html
