摘要:結論使用獲取客戶端不會自動取中的值需求多帶帶處理。參考資料負載均衡的場景下如何獲取客戶端地址
[toc]
場景線上環境使用Nginx(安裝在宿主機)+Docker進行部署,應用獲取客戶端ip地址不正確,獲取客戶端IP的代碼為Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4()
過程還原 搭建一個webapi示例環境創建一個新項目
dotnet new webapi -o getRealClientIp
修改模板中的ValuesController的Get方法
// GET api/values [HttpGet] public ActionResult容器相關配置Get() { return this.Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); }
docker-compose.yml
version: "2" services: web: image: microsoft/dotnet:2.1-aspnetcore-runtime volumes: - ./publish:/app #站點文件 command: dotnet /app/getRealClientIp.dll ports: - "5000:80" networks: test: ipv4_address: 172.200.0.101 nginx: image: nginx networks: test: ipv4_address: 172.200.0.102 volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro # nginx配置文件 ports: - "5001:80" networks: test: ipam: config: - subnet: 172.200.0.0/16 gateway: 172.200.0.1
nginx.conf
http { server { listen 80; access_log off; location / { proxy_pass http://172.200.0.101:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Via "nginx"; } } } events { worker_connections 1024; }運行查看效果
dotnet publish -c Release -o ./publish #編譯 docker-compose up #運行容器
curl http://localhost:5000/api/values 172.200.0.1
返回的ip地址172.200.0.1是配置的容器的網關地址,能獲取到正確的ip
curl http://localhost:5001/api/values 172.200.0.102
返回的ip地址172.200.0.102是nginx容器的地址,沒有獲取到正確的ip
上面的nginx配置已經相關的轉發參數,并且該參數配置之前能正常運行在php的環境;
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
推斷必須修改 asp.net core 相關代碼,才能獲取到真實的客戶端ip地址,一番google之后,
// GET api/values [HttpGet] public ActionResultGet() { var ip = this.Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (string.IsNullOrEmpty(ip)) { ip = this.Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); } return ip; }
重新編譯運行
dotnet publish -c Release -o ./publish #編譯 docker-compose up #運行容器 curl http://localhost:5001/api/values 172.200.0.1 curl http://localhost:5000/api/values 172.200.0.1
直接訪問和通過nginx代理訪問返回的ip地址均為172.200.0.1,獲取正確。
結論asp.net core 使用 Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4()獲取客戶端ip,不會自動取Header中X-Forwarded-For的值,需求多帶帶處理。
參考資料負載均衡的場景下ASP.NET Core如何獲取客戶端IP地址
How do I get client IP address in ASP.NET CORE?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40614.html
摘要:結論使用獲取客戶端不會自動取中的值需求單獨處理。參考資料負載均衡的場景下如何獲取客戶端地址 [toc] 場景 線上環境使用Nginx(安裝在宿主機)+Docker進行部署,應用獲取客戶端ip地址不正確,獲取客戶端IP的代碼為Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4() 過程還原 搭建一個webapi示例環境 創建一...
摘要:容器化容器化之多容器應用部署容器化部署引言上兩節我們通過簡單的學習了的基本操作。基于當前項目構建的容器服務,依賴于服務。最后,使用綜合完成了容器化部署。參考資料容器化容器化之多容器應用部署 showImg(https://segmentfault.com/img/remote/1460000012801559); .NET Core容器化@Docker.NET Core容器化之多容器...
摘要:容器化容器化之多容器應用部署容器化部署引言上兩節我們通過簡單的學習了的基本操作。基于當前項目構建的容器服務,依賴于服務。最后,使用綜合完成了容器化部署。參考資料容器化容器化之多容器應用部署 showImg(https://segmentfault.com/img/remote/1460000012801559); .NET Core容器化@Docker.NET Core容器化之多容器...
閱讀 2106·2021-11-05 09:42
閱讀 2850·2021-09-23 11:21
閱讀 2840·2019-08-30 14:00
閱讀 3313·2019-08-30 13:15
閱讀 464·2019-08-29 17:18
閱讀 3546·2019-08-29 16:29
閱讀 2748·2019-08-29 14:06
閱讀 2793·2019-08-23 14:41