浅谈Nginx 反向代理

发布于 2020-07-24  2.58k 次阅读


不废话上例子

location ~ .*
    {
//proxy_set_header 可以往每次头文件加点料,当然没有特殊要求自然空着就好,该值可以包含文本、变量和它们的组合。
        proxy_set_header Host $domain.ex;
        proxy_set_header Referer "https://目标域名";
        proxy_set_header Accept-Encoding "";
//proxy_cookie_domain 为作用为修改cookie所对应域名,详细在本文后面会提到
        proxy_cookie_domain 替换的域名 想要替换成的域名;
//该指令是用来设置代理服务器的地址,可以是主机名称,IP地址加端口号等形式。命令有点bug,本文后面将会解释
        proxy_pass https://$domain.想要代理的站点一级域名;
//proxy_redirect 可以将目的站点返回的url修改,神器也...
        proxy_redirect https://exmple.com/ https://exmple1.com/;
//如果想要替换页面字符可以试试sub_filter
        sub_filter "要替换的内容" "想换成的内容";
//不仅可以修改页面上的文字,也可以利用它修改目标站点上的相应内容来源
        sub_filter "example.com" "example1.com";
}

以上代码整合为一个使用项目的话请戳这

神代綺凜大佬的blog————(https://moe.best/technology/pixiv-proxy.html


解释一下上边proxy_pass命令的问题和proxy_cookie_domain作用

proxy_pass固然很香,但是nginx会将解析然后缓存这个内容。如果需要解析的内容经常更换,则容易出bug。这里Nginx官方也不建议仅仅单用proxy_pass命令,因为这具有以下其他缺点:

  • 如果域名无法解析,则NGINX无法启动或重新加载其配置。
  • NGINX会缓存DNS记录,直到下次重新启动或重新加载配置时,都会忽略记录的TTL值。
resolver 10.0.0.2 valid=10s;

server {
    location / {
        set $backend_servers backends.example.com;
        proxy_pass http://$backend_servers:8080;
    }
}

官方的建议是定义一个变量,直接忽略TTL,按照这个固定频率获取目标IP。


proxy_cookie_domain的作用:

这又涉及到cookie了。浏览器在设置cookie选项的时候,所选取的内容都是缓存中接口域名下的。然后request只要请求发送出去之后,cookie中有关域名信息其实是不存在的,它只是一个普通的字符串,随便proxy_pass到任何位置,都会正常携带下去。因此server端在做响应的时候,通过set-cookie的domain属性,可以控制cookie的生效域名目标,做到二级域名cookie分离等等,如果前端接收到的set-cookie的domain和当前域名不一致,或者一级域名不一致(二级域名可以共享一级域名下的cookie),这个cookie在后续的通信中就是无效的,所以这里才需要去做domain的转换,也就是说当reseponse的set-cookie中domain不去设置时,cookie顺利传入浏览器中,浏览器也会自动设置这个cookie的生效域名为当前域名。


非彼无我,非我无所取。是亦近矣,而不知其所为使。