大家好,我是 17。
今天和大家聊聊 pass_proxy 代理。
在前端代理主要是为了跨域。虽然前端跨域有多种方法,各有利弊,但用代理来跨域对开发是最友好的。用代理可以不用修改产品代码切换线上线下,非常安全。pass_proxy 默认会把 cookie 也一同转发。 常用的配置非常简单。
前端 /api/user
后端 /api/user
location ^~ /api/ {proxy_pass http://127.0.0.1:3001;}
不带斜杠把 path 直接拼接在 url后面;
前端 /api/user
后端 /user
location ^~ /api/ {proxy_pass http://127.0.0.1:3001/;}
带斜杠会先去掉匹配到的 path, 再拼接。
~ 区分大小写正则匹配 ,~* 不区分大小写正则匹配 。location 用正则匹配的时候,proxy_pass 后面不能以 / 结尾,因为 nginx 不能处理这种情况。
location ~ /api/ {proxy_pass http://127.0.0.1:3001/;}
本例中,请求 localhost:3000/ 会导致 nginx 报错。
前端 /api/user
后端 /web/api/user
location ^~ /api/ {proxy_pass http://127.0.0.1:3001/web$request_uri;}
location /search/ {rewrite /search/([^/]+) /s?wd=$1 break;proxy_pass http://127.0.0.1:3001;
}
反向代理: 简单来说 proxy_pass 把请求转发到其它服务地址的时候,就是反向代理。
如果是客户端与服务器直接连接,nginx 变量 $remote_addr
就可以拿到真实ip。$remote_addr
是不能伪造的。但是如果客户端是经过反向代理连接的服务器,服务器能拿到的只有代理服务器的 IP。为了能拿到客户端真实 IP,代理服务器在转发的时候需要加上一个 http 扩展头部 X-Forwarded-For。
所有代理的 ip 依次列出来,从远及近。
X-Forwarded-For: IP0, IP1, IP2
X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代 理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。
location /api/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:3000/;}
$proxy_add_x_forwarded_for
变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr
用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for
等于$remote_addr
。$remote_addr
变量的值是客户端的IP。
可能你会担心,ip会不会被伪造。即使客户端伪造了 ip,nginx 也会用真实的 ip 进行重置。所以 $remote_addr
是可信的。