如何使用nginx将所有不包含某些字符串的请求重定向到400

时间:2014-04-28 16:04:59

标签: regex nginx

我正在尝试阻止或重定向到所有在uri中不包含某些字符串或关键字的请求。我正在寻找使用nginx的解决方案。 特别是" NOT包含字符串"。如果不可能! (不)匹配,有没有其他选择。

2 个答案:

答案 0 :(得分:0)

嗯,你可以尝试这样的事情:

location / {
    if (condition_1) {
        break;
    }
    if (condition_2) {
        break;
    }
    ...
    if (condition_n) {
        break;
    }
    return 400;

    proxy_pass http://backend;
}

如果condition_1,... condition_n匹配,break关键字阻止return 400,请求转到proxy_pass。如果所有条件都失败return 400将使nginx响应400 Bad Request错误。

条件可以是if支持的任何内容。例如。 if ($args_pass = 1)if ($http_user_agent ~ MSIE)

答案 1 :(得分:0)

我建议使用地图:

map $uri $bad_request {
    # start by assuming it's a bad request
    default 1;

    # if any of the following match, clear the $bad-request variable
    ~a-required-string 0;
    ~another-required-string 0;
    # ...
}

location / {
    if ($bad_request) {
        return 400;
    }
}