首页 > 解决方案 > 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;
}

我做错了什么?

PS:如果你没有得到if,如果你的httpreferer不包含“stackoverflow.com”,你就无法打开文件

标签: variablesnginxluawebserveropenresty

解决方案


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

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

然后检查结果变量值:

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

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

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

推荐阅读