背景

目前很多时候,部署一些服务或者工具,大多都采用docker部署,而为了更好的管理服务,我们会按照Nginx-Proxy-Manager(NPM)

一般情况下,都是没有问题的,一套Dockerfile,docker-compose.yml配置,然后 docker-compose up -d就完事了。但是如果在一些场景,我们可能需统计请求用户的ip地址。

我们一般可以使用remote_addr的请求头拿到客户的ip,但是如果请求经过了服务代理(比如我们服务器的ng代理,apache代理),我们可能拿到的就不是客户端的ip了,而是代理的ip。

代理服务器会将 X-Forwarded-For或者X-Real-Ip或者Proxy-Client-Ip 替换为代理服务器的ip(可能是服务器的局域网ip)

既然知道了问题,那么我们只需要把这些请求头改为真是的用户ip即可,比如用的nginx代理服务器,就可以添加如下配置

1
proxy_set_header X-Real-IP $remote_addr;

然后在代码中获取这个请求头即可

如 go代码

1
2
3
4
5
func GetRemoteIp(r *http.Request) string {
ip := r.Header.Get("X-Forwarded-For")
return ip
}

以上一般来说已经解决问题了,但是我用的是NPM(docker部署),可以用webUI管理,那我要如何在webUI中添加请求头呢

试错1:在Advanced内容中添加,但是下面提示这样是不会生效的

https://github.com/yuzhi-jiang/imgbed/raw/main/Qexo/24/8/image_d47e89c402054234d6fe581d677e463d.png

试错2:按照提示,加上了location,对接口添加 header,但是,这样是会覆盖原有的配置,会导致接口或者页面无法访问(404)

https://github.com/yuzhi-jiang/imgbed/raw/main/Qexo/24/8/image_9d270bd77dc85faece5b5cf66e92b15f.png

解决方法:我门可以添加Custom Location(配置和Details中一样),并且在下面添加标头,这样是不会覆盖的

https://github.com/yuzhi-jiang/imgbed/raw/main/Qexo/24/8/image_6b0302df2739e50e3d67b6173770d725.png