Nginx if 运算符

程序员们,早上好!我正在尝试保护一个文件,并检查打开它的 http_referer。例如:

if ($http_referer != "stackoverflow.com") {
    return 403;
}

到目前为止,这个句子工作得很好,这种情况下我不想要等于操作符,而是想要包含操作符,例如 "!~",因此我把它转换为:

if ($http_referer !~ "stackoverflow.com") {
    return 403;
}

仍然,这个也很好用,但为了使一切顺利运行,我需要在字符串中使用变量,例如这样:

set $website stackoverflow.com;
if ($http_referer != $website) {
    return 403;
}

问题在于我可以使用 "!=" 运算符,但它不能在 "!~" 中工作,例如下面的句子是不起作用的:

set $website stackoverflow.com;
if ($http_referer !~ $website) {
    return 403;
}

我做错了什么吗?

P.S: 如果你不明白 if,那么当你的 http referer 不包含 "stackoverflow.com" 时,就不能打开该文件

点赞
用户7121513
用户7121513

据我所知,在nginx配置中不能在正则表达式模式中使用变量。我认为这是因为它们在nginx启动时编译。解决这个问题的通用方法是使用map块:

map $http_referer $valid_value {
    ~stackoverflow\.com    1;
}

然后检查结果变量的值:

if ($valid_value != 1) {
    return 403;
}

但是,为了检查确切的Referer HTTP头值,存在一个特殊的valid_referers指令,您可以在其中使用一个或多个正则表达式:

valid_referers ~stackoverflow\.com;
if ($invalid_referer) {
    return 403;
}
2020-07-18 18:27:20