nginx 常用配置之 pass_proxy

大家好,我是 17。

今天和大家聊聊 pass_proxy 代理。

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;
 }

代理之前rewrite

location /search/ {
    rewrite    /search/([^/]+) /s?wd=$1 break;
    proxy_pass http://127.0.0.1:3001;
}

服务端获取真实ip

反向代理: 简单来说 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 是可信的。

猜你喜欢

转载自blog.csdn.net/m0_55635384/article/details/129154554
今日推荐