variables - 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”,你就无法打开文件
解决方案
据我所知,您不能在 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;
}
推荐阅读
- api - 在我的 api 请求调用中,无论我如何尝试,我总是会收到 401 错误,我总是会遇到同样的错误
- html - 在所有设备中以固定对齐方式在图像上显示按钮
- c++ - 为什么当一个字符数组与另一个字符数组比较时,输出是错误的,而当字符数组与字符串比较时,输出是正确的?
- flutter - 检查发布依赖项的平台支持
- python - 找到每个数字恰好只有一次并且能被 11 整除的最大数(在一个范围内)
- reactjs - 在 NextJS 中更新 ApolloClient 缓存时出现问题
- android - 使用远程蓝牙设备启动绑定过程
- css - 如何在 CSS 网格中对齐图像
- postgresql - 是否可以在 Timescale 中为一个视图设置多个刷新连续聚合策略?
- git - 如何 git clone --bare 只有一个分支并轻松更新