nginx refer与origin的异常数据拦截
valid_referers none *.abc.cn 是不行的
valid_referers none ~*\.abc\.cn 是不行的
~^(.*\.)?abc\.cn 是可以的
- 一个正则表达式如果以 “~” 开头,表示这个正则表达式对大小写敏感。以 “~*”开头,表示这个正则表达式对大小写不敏感。
map $http_origin $allow_cors {#拦截origin #20250327 0033
default 1;#默认空的时候,是可以通过的
"~^https://testtest.abc.cn:8001" 1; #以这个开头也是可以通过的
"~^https://10.124.111.111:8111" 1; #测试环境门户跳转时的origin
"~^(.*\.)?abc\.cn" 1; #只要包含这个的就是1
"~*" 0;#其他情况,其他的origin是直接报403的
#还有一种情况就是浏览器拦截的时候,需要通过addHeader增加允许跨区域的请求头,多用于自己系统的页面嵌入到其他系统的页面中
}
location /testserv/ { # 拦截所有/testserv下的接口请求,将请求地址的ip和端口号换为 proxy_pass 中的值。接口地址其他地方不变
# 用于解决跨域问题
#20250327 0033
# 通过refere设置访问接口的白名单,防盗链。只允许以下ip的页面访问这个资源
valid_referers none testtest.abc.cn 10.124.111.111 ~^(.*\.)?abc\.cn;#测试环境pc端地址,none解决假登录没有rerfer头的情况,.111是门户
if ($invalid_referer) {
return 403;
}
if ($allow_cors = 0){#origin的非法参数拦截问题
return 403;
}
origin与refer的测试效果,针对不同的语句不大一样
目的是拦截origin与referer,仅放行:
1、以https://testtest.abc.cn:8001、https://10.124.111.111:8111 为开头的
2、包含abc.cn字符串的
3、origin或者referer为空
实验证明:
map的写法与valid_referers的写法,对~^(.*\.)?abc\.cn 有不同的处理逻辑
最大的不同为:
1、origin为abc.cn:1231,可以放行。但是referer为abc.cn:1231 不可以放行
2、只有当referer的最前面有https://或者http://时,才可以,例如https://abc.cn:123 referer才放行