一、为什么 ifset 经常一起出现

原笔记在介绍 rewrite 模块相关指令时,把 ifset 一起放到了非常实用的位置上。
它们的组合思路其实很简单:

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

这个结构很适合做一个简单的维护开关:

  • 正常状态下 $flag0
  • 网站照常访问
  • 维护时只改成 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 更符合语义。

八、小结

ifset 的价值,不在于写出多复杂的逻辑,而在于快速完成简单、明确的条件控制。
原笔记这两个案例就很典型:

  • $request_method 做请求方法限制
  • $flag 做维护模式开关

当你只需要轻量级条件判断时,这组组合往往比引入更复杂的机制更高效。