nginx location内多个if仅一个生效
文章目录
nginx 内多个 if 仅一个生效问题
说明
- 当前场景下,前端项目部署对 nginx 有两个要求:
- 对类型是 html 的资源配置 Cache-Control “no-store”
- 基于 IP 进行区分,符合条件的 IP,将请求转发至部署灰度服务的目录下
- 针对 Cache-Control “no-store”,常规配置如下
|
|
- 针对匹配 IP,常规配置如下
- 使用 IF 判断存储请求 IP 的 Header,是否满足条件,转发至灰度目录
|
|
- 同时配置后,发现灰度环境无法正常转发
|
|
问题定位
- 通过注释、及调整顺序后发现,发现仅最后一个 if 生效
- 感觉工作机制类似于每个 if 都会把之前 if 内的配置丢掉,类似于新开线程调继续执行后续代码
问题处理
Plan1:较常规的处理方案
- 使用 map 代替第一个 if
- http 层内定义 map,根据 IP 进行匹配,将对应的资源目录赋给变量
|
|
- location 内进行配置
|
|
Plan2:针对当前场景也可解决问题的方案
- 由于第一个 if 仅匹配其他资源,后续条件可以不走,可以取巧再第一个 if 内 break 掉
- 这样也可实现匹配 IP 的请求进灰度目录,不匹配的走后续流程,但是进入灰度的资源加不上 Cache-Control “no-store”
|
|
拓展:nginx if 生效情况
- location 内多个 if,仅最后一个 if 生效
|
|
- if 前转、改写配置失效
|
|
|
|
参考
文章作者 Xiang
上次更新 2024-08-22