跳转至

Nginx if与set指令


2016-01-11 by dongnan

开始之前

由于 nginx if指令不支持逻辑与操作,所以需要"曲线救国",依次赋值变量,最后判断变量值,完成逻辑与功能。

目标

  • 使用 nginx $http_user_agent、$uri变量,结合 if 语句,完成多重条件判断。
  • 应用场景,对恶意 post行为返回 405状态。

配置文件

# 执行命令
cat /etc/nginx/conf.d/default.conf

# 返回结果   
server    
{
    #... 其它配置项省略

    # 设置变量为空字符串
    set $black '';

    # 条件1
    if ($http_user_agent ~* "(compatible; MSIE 9.0; Windows NT 6.1)") {
      set $black "${black}1";
    }

    # 条件2
    if ($uri ~* "/tools/sendSms" ) {
      set $black "${black}1";
    }

    # 条件3 "逻辑与"为变量叠加的形式,既条件为真设置值为1.
    if ($request_method = POST) {
      set $black "${black}1";
    }

    # 条件3 "逻辑或",如任意一个条件为假设置值为0.
    if ($request_method != POST) {
      set $black "${black}0";
    }

    # 叠加后的变量值,"逻辑与"111,"逻辑或"110.
    if ($black = "111") {
      return 405;
    }

}

验证

使用 POST 方法,服务器返回 405 状态。

curl -LI -X "POST" -A "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "http://localhost/tools/sendSms?type=mobilephone&mobilephone=1597XXXXX06"
HTTP/1.1 405 Not Allowed
Server: nginx
#...省略

其它方法(GET/HEAD),服务器返回 200 状态。

curl -LI -A "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "http://localhost/tools/sendSms?type=mobilephone&mobilephone=1597XXXXX06"
HTTP/1.1 200 OK
Server: nginx
#...省略

指令帮助

return

语法: return code
默认值: none
使用字段: server, location, if
这个指令结束执行配置语句并为客户端返回状态代码,可以使用下列的值:
204,400,402-406,408,410, 411, 413, 416与500-504。
此外,非标准代码444将关闭连接并且不发送任何的头部。

set

语法: set variable value
默认值: none
使用字段: server, location, if
指令设置一个变量并为其赋值,其值可以是文本,变量和它们的组合。
你可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部变量的值



回到页面顶部