一、为什么 if 和 set 经常一起出现¶
原笔记在介绍 rewrite 模块相关指令时,把 if 和 set 一起放到了非常实用的位置上。
它们的组合思路其实很简单:
set负责创建或修改变量if负责基于变量做判断
一旦两者配合起来,就能很方便地完成:
- 条件拦截
- 维护模式
- 方法限制
- 某些简单的流量控制
二、if 在 Nginx 里能做什么¶
原笔记对 if 的描述包括:
- 可以做判断
- 一般搭配 Nginx 变量使用
- 可以做等于、不等于、匹配和排除
基本格式是:
if (条件) {
满足条件执行的内容;
}
常见匹配符号包括:
~~*!~!~*
这意味着它既可以做正则匹配,也能做排除判断。
三、案例一:限制只允许某些请求方法¶
原笔记给出的需求是:
- 站点
rewrite.oldboylinux.cn - 只允许部分请求方法
- 其他方法直接拒绝
配置示例如下:
server {
listen 80;
server_name rewrite.oldboylinux.cn;
root /app/code/rewrite;
if ( $request_method !~ "GET|POST" ) {
return 403;
}
location / {
index index.html;
}
}
这里用到的核心变量是:
$request_method
也就是请求方法本身。
原笔记随后通过测试发现:
- 普通
GET请求可以正常访问 curl -I发出的HEAD请求返回了403
这其实也揭示了一个很实用的细节:
虽然文字描述里提到“只准许 GET、POST、HEAD”,但示例配置写的是 "GET|POST",所以 HEAD 实际上并没有被放行。
如果想真的允许 HEAD,就需要把条件改成类似:
if ( $request_method !~ "GET|POST|HEAD" ) {
return 403;
}
四、set 的作用是什么¶
原笔记把 set 理解成:
- 用于自己创建或修改 Nginx 变量
并用 Shell 变量做了对比:
# shell 写法
oldboy=666
echo $oldboy
# nginx 写法
set $lidao 996;
这里的重点是:
- Nginx 变量名使用时也要带
$ set本质上是在配置阶段给变量赋值
五、案例二:用变量控制网站是否进入维护模式¶
原笔记的第二个案例非常实用:
- 定义一个标记变量
$flag - 默认值是
0 - 如果
$flag = 1,网站返回503
完整配置如下:
server {
listen 80;
server_name rewrite.oldboylinux.cn;
root /app/code/rewrite;
set $flag 0;
if ( $flag = 1 ) {
return 503;
}
if ( $request_method !~ "GET|POST" ) {
return 403;
}
location / {
index index.html;
}
}
这个结构很适合做一个简单的维护开关:
- 正常状态下
$flag是0 - 网站照常访问
- 维护时只改成
1 - 然后统一返回
503 Service Temporarily Unavailable
六、这个维护模式是怎么切换的¶
原笔记通过命令直接修改配置文件中的变量值:
sed -i '/set/s/0/1/' rewrite.oldboylinux.cn.conf
然后再执行:
nginx -t
systemctl reload nginx
此时再次访问站点,就会看到:
- 正常页面变成
503
这类方案虽然简单,但在很多临时维护、升级窗口或功能封禁场景里非常实用。
七、为什么维护模式常用 503 而不是 403¶
从原笔记的使用方式可以看出,两者表达的语义不同:
403更偏向“你没有权限访问”503更偏向“服务暂时不可用”
维护期通常不是要永久拒绝用户,而是要表达:
- 当前系统暂时不可服务
- 过一段时间会恢复
所以用 503 更符合语义。
八、小结¶
if 和 set 的价值,不在于写出多复杂的逻辑,而在于快速完成简单、明确的条件控制。
原笔记这两个案例就很典型:
- 用
$request_method做请求方法限制 - 用
$flag做维护模式开关
当你只需要轻量级条件判断时,这组组合往往比引入更复杂的机制更高效。