Nginx配置:拦截Firefox/Chrome User-Agent,设置IP与Referer白名单
Nginx 配置实现指定UA拦截+IP/Referer白名单
完整配置示例
# 初始化拦截标记变量,默认不触发拦截 set $block ""; # 第一步:识别需要检查的User-Agent if ($http_user_agent ~ (Firefox|Chrome)) { set $block "${block}A"; } # 第二步:校验请求IP是否在白名单内 if ($remote_addr !~ ^(44\.221\.341\.44|44\.221\.342\.33)$) { set $block "${block}B"; } # 第三步:校验Referer是否在白名单内 if ($http_referer !~* ^https?://(test\.com|test\.nl|test\.de)/) { set $block "${block}C"; } # 只有三个条件同时满足时,才返回403拦截 if ($block = "ABC") { return 403; }
配置逻辑说明
- 用
$block变量累计拦截条件标记,初始为空,只有满足对应条件才追加标记。 - 先锁定需要拦截的UA(Firefox/Chrome),标记
A——只有这类请求才需要后续白名单校验。 - 如果请求IP不在指定的两个白名单IP里,追加标记
B;如果Referer不在允许的域名列表里,追加标记C。 - 最终只有当
$block等于ABC时,才会返回403:- 只要是白名单IP的请求,不管UA是什么都能访问;
- 只要Referer符合白名单,不管UA是什么都能访问;
- 只有UA是Firefox/Chrome、IP不在白名单、Referer也不在白名单的请求,才会被拦截。
补充注意事项
- Nginx不推荐嵌套
if,用变量拼接的方式是最稳妥的多条件判断方案。 - Referer匹配用
~*实现不区分大小写,^https?://确保匹配完整的域名前缀,避免被类似xtest.com的域名绕过。 - 如果需要允许空Referer的请求,把Referer判断条件改成
!~* ^https?://(test\.com|test\.nl|test\.de)/|^$即可。
内容的提问来源于stack exchange,提问作者user19744349
相关产品推荐
相关产品推荐

