0%

nginx代理的一种使用方式

nginx 的代理相信大家都使用过,例如负载均衡,高可用等等,对于这些应用,资料有很多,但是像是以下这种很特别的情况,却没啥资料:

GET http://www.example.com/http://file.example.com/download.bin

只能访问www.example.com,但是想要使用file.example.com的文件,其中file.example.com是动态的;这种情况下,简单的方式是,在服务器上配置子路径,进行一一对应,可如果file.example.com有很多呢?

本文仅作为一个记录。

当前方法不适合直接暴露在公网,可能会导致意料之外的安全问题。如果确实想要在公网使用,请配置防火墙,或者访问白名单

配置IP白名单的时候,请考虑docker等容器导致内网IP影响

配置的方式通过nginx的正则方式,因为在一些浏览器里面 // 会变为单个/进行请求,所以代码里面加上?表达式,可选其中一个/

为了能够将GET参数传递,去掉了表达式的结尾$,同时在 proxy_pass 后加上$is_args$args

同样,为了兼容httphttpshttps里面的s使用(s?)进行提取,有需要的话,可以考虑加上ftp但是目前已经没啥服务会使用ftp协议直接传输

最后的配置内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
geo $ip_list {
default 0;
#设置默认值为0
127.0.0.1 1;
#172.21.0.1 1;
}
server {
....

location ~ ^/http(s?)://?(.*) {
# 此处 = 0 则是白名单访问;即只有列出来的IP能访问
# 此处 = 1 则是黑名单访问;即除了列出来的IP,都能访问
if ( $ip_list = 0 ) {
return 403;
}
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http$1://$2$is_args$args;
}

....
}