Nginx if 运算符

Nginx if operators

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

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

So far so good, this sentence works well, in this case I don't want the equal operator but I want the contain operator like "!~", 所以我把它变成了:

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

尽管如此,它也运行良好,但为了使一切 运行 完美无缺,我需要像这样在字符串上使用变量:

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

这里的问题是我可以将变量与“!=”运算符一起使用,但它不适用于“!~”,在这种情况下,我给出的句子有效,但下面的这句话不起作用工作:

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

我做错了什么?

P.S:如果你没有得到 if,如果你的 http referer 不包含“whosebug.com”[=27,你将无法打开文件=]

据我所知,您不能在 nginx 配置的正则表达式模式中使用变量。我认为那是因为它们是在 nginx 启动时编译的。一般的解决方案是使用 map 块:

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

然后检查结果变量值:

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

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

valid_referers ~Whosebug\.com;
if ($invalid_referer) {
    return 403;
}