Nginx$upstream_addr变量在IF条件下不起作用 [英] Nginx $upstream_addr variable doesn't work in if condition

查看:25
本文介绍了Nginx$upstream_addr变量在IF条件下不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用ngx_http_proxy_module中的proxy_pass指令运行反向代理。我想forbid访问某些后端网段(如172.0.0.0/24)。我试过了

if ($upstream_addr ~* "^172.*") {                                     
    return 403;                                                    
}
add_header X-mine "$upstream_addr";

serverlocation两个上下文中都不工作,即nginx仍返回200:

$ curl localhost -I
HTTP/1.1 200 OK
Server: nginx/1.17.0
Date: Thu, 13 Feb 2020 12:58:36 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
Last-Modified: Tue, 24 Sep 2019 14:49:10 GMT
ETag: "5d8a2ce6-264"
Accept-Ranges: bytes
X-mine: 172.20.0.2:80

我错过了什么?(请注意,我将$upstream_addr变量的内容添加到X-mine头中进行调试。)

推荐答案

我的理解是,if指令在发送上行请求之前运行,而$upstream_addr头只在上行请求完成后设置。我试图找到解释确切过程的权威文档,但失败了,但nginx文档似乎遗漏了一些人们可能希望的东西。

有关更多指导,请参阅this answerIf is evil。事实上,我不太确定你想要实现什么,所以我不能对它是否可能实现抱有任何希望。

这篇关于Nginx$upstream_addr变量在IF条件下不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆