Nginx + Lua 实现每日访问次数限制与防盗链校验

news/2025/10/31 16:09:47/文章来源:https://www.cnblogs.com/echohye/p/19180327

🧾 Nginx + Lua 实现每日访问次数限制与防盗链校验(以 /cmap 图片接口为例)

一、应用场景

/cmap 是一个图片接口(通过 proxy_pass 转发到后端),
需要实现:

  1. 每日最多访问 1000 次
  2. 防盗链检查(仅允许特定来源 Referer)
  3. 当返回 403 / 429 时输出 JSON 格式提示
  4. 正常访问时返回图片内容(不影响 Content-Type)

二、依赖模块

要启用 access_by_lua_block,Nginx 需要编译 ngx_http_lua_module 模块。
如果是自己构建镜像,请确保编译参数中包含:

--add-module=/path/to/lua-nginx-module

并在 Nginx 配置文件中引入 Lua 共享内存:

lua_shared_dict access_limit 10m;

三、核心配置示例

location /cmap {proxy_pass http://10.18.55.96/cmap/layer;access_by_lua_block {-- 每日访问上限local limit = 1000local key = "cmap_access_count"local dict = ngx.shared.access_limitlocal day = os.date("%Y%m%d")local count_key = key .. ":" .. day-- ======================-- 防盗链检查-- ======================local headers = ngx.req.get_headers()local referer = headers["referer"]-- 允许的来源列表(使用正则匹配)local allowed_domains = {"^https?://10%.18%.55%.98:30001/","^https?://yourdomain%.com/"}-- 是否允许空 Referer(例如浏览器直接访问)local allow_empty_referer = truelocal valid = falseif referer thenfor _, pattern in ipairs(allowed_domains) doif referer:match(pattern) thenvalid = truebreakendendelseif allow_empty_referer thenvalid = trueendif not valid thenngx.status = 403ngx.header.content_type = "application/json; charset=utf-8"ngx.say('{"code":403,"message":"Forbidden: Invalid Referer"}')return ngx.exit(403)end-- ======================-- 每日访问次数统计-- ======================local current = dict:get(count_key)if not current thendict:set(count_key, 0, 86400)  -- 有效期1天current = 0endif current >= limit thenngx.status = 429ngx.header.content_type = "application/json; charset=utf-8"ngx.say(string.format('{"code":429,"message":"Daily access limit exceeded","count":%d,"limit":%d}',current, limit))return ngx.exit(429)endlocal new_count = dict:incr(count_key, 1)if not new_count thendict:set(count_key, current + 1, 86400)new_count = current + 1endngx.log(ngx.INFO, string.format("cmap accessed %d/%d times today", new_count, limit))}
}

四、逻辑说明

功能 说明
防盗链 校验 Referer 是否来自白名单域名或允许为空
访问计数 使用 ngx.shared.DICT 记录每日访问次数
时间粒度 以当天日期为 key(如 20251031
响应格式 正常请求 → 返回图片;403 / 429 → 返回 JSON
过期机制 每天自动重置计数(缓存过期 86400 秒)

五、Referer 匹配规则

写法 匹配示例 说明
"http://10.18.55.98:30001/" 仅匹配该路径开头(string.find 简单匹配
"^https?://10%.18%.55%.98:30001/" 匹配 http 或 https 前缀 推荐正则匹配
"^https?://yourdomain%.com/" 匹配自定义域名 正则匹配更安全

六、其他建议

  • 若服务器被直接访问(无 Referer),可启用 allow_empty_referer = true
  • 若需更精细限制(如按 IP 统计、按小时限流),可在 key 中加上 ngx.var.remote_addros.date("%H")
  • 若使用 Docker 运行,需要在镜像中包含 lua-nginx-moduleluajit

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/951928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Photoshop 2026 v27.0正式版终于来了,AI 加持让创意更自由

在数字图像与图形设计领域,创意工具的选择直接影响创作效率与成果质量。Adobe Photoshop 凭借卓越性能与前沿工具,长期占据全球设计领域核心地位,成为创意从构想落地的可靠平台。伴随设计需求的日益提升,Adobe 近期…

大故障,阿里云核心域名疑似被劫持 - 教程 (转载)

原始链接:https://www.cnblogs.com/yfceshi/p/18992502 2025年6月5日凌晨,阿里云多个服务突发异常,罪魁祸首居然是它自家的“核心域名”——aliyuncs.com。包括对象存储OSS、内容分发 CDN、镜像仓库 ACR、云解析 DN…

学习笔记:乘法逆元

问题引入 如何求 \(\dfrac{a}{b}\)?小学数学告诉我们,\(\dfrac{a}{b} = a \times \dfrac{1}{b}\)。 那么若 \(a, b, p \in \mathrm{\mathbf{Z}}\),如何求 \(\dfrac{a}{b} \bmod \ p\),并且 \(a\) 和 \(b\) 都是八常…

2025年北京保洁服务公司推荐:海獭顾家保洁服务公司深度测评

TOP1推荐:海獭顾家(北京)保洁服务有限公司 评价指数:★★★★★ 口碑评分:98分 行业表现:A++++级 介绍:海獭顾家(北京)保洁服务有限公司从事专业保洁服务长达20年,注册资本501万元。作为专业石材工程施工单位…

三角函数:从入门到入门

必修一三角函数:从入门到入门 任意角与弧度制始边近似视为x轴正半轴从始边,逆时针转到一个终边,视为正角,反之亦然射线,$ \alpha = \alpha + 360^{\circ} \times k , k \in \ \mathbb{Z} $直线,$ 360 -> 180 …

1063:最大跨度值

题目描述】 给定一个长度为n的非负整数序列,请计算序列的最大跨度值(最大跨度值 = 最大值减去最小值)。 【输入】 一共2行,第一行为序列的个数n(1 <= n <= 1000),第二行为序列的n个不超过1000的非负整数,整…

学术会议合集 | 机器人、大数据、社会科学、医学人工智能等EI会议合集

机器人、大数据、社会科学、医学人工智能等EI会议合集第二届机器人前沿技术与创新国际会议(FTIR 2025) 2025 2nd International Conference on Frontier Technology and Innovation in Robotics 重要信息 大会官网:…

基于块匹配的MATLAB视频去抖动算法

一、核心代码 1. 视频读取与预处理 %% 视频参数设置 videoFile = input.mp4; reader = vision.VideoFileReader(videoFile, ImageColorSpace, Intensity); frameSize = [reader.VideoSize(2), reader.VideoSize(1)]; %…

2025年回转窑干燥机设备定制厂家权威推荐榜单:回转窑滚筒干燥机/回转窑设备/回转窑干燥机源头厂家精选

在工业干燥领域,回转窑干燥设备的市场需求持续增长,2024年国内市场规模已达87亿元,预计2025年将突破92亿元,年复合增长率稳定在6%-8%之间。 回转窑干燥机作为工业干燥领域的核心设备,凭借其处理量大、适应性强、运…

资源字典(ResourceDictionary)学习笔记

这个世界没你想的那么坏但也没你想的那么好——烽火戏诸侯《剑来》1️⃣ 基础概念与用法 🔹 什么是 ResourceDictionary? 在 WPF(Windows Presentation Foundation) 中,ResourceDictionary(资源字典)是一种特…

2025年电子设备厂家年度排名推荐,幸运电子设备有限公司

在当今科技飞速发展的时代,电子设备的精准性、稳定性和创新性对于各个行业的重要性不言而喻。众多企业和科研机构在选购电子设备时,常常会面临 幸运电子设备有实力吗幸运电子设备的创新理念强吗 等诸多疑问。在此背景…

如何一句话证明你懂项目管理或当过项目经理?

项目管理的复杂,恰恰在于它需要在变化中找平衡。而项目管理的价值,也正在于把不确定的挑战,通过系统性的把控,一步步变成可落地、可交付的成果。计划就是用来被打破的——这大概是每个项目经理的痛。 在过去做项目…

linux 使用指南

编译方法:touch a.cpp gedit a.cpp g++ a.cpp -o a.exe -O2 -std=c++14 ./a.exe

2025年不锈钢带制造厂推荐:五大不锈钢带制造企业深度解析

TOP1推荐:深圳市富鹏达金属材料有限公司 评价指数:★★★★★ 口碑评分:98分 行业表现:A++++级 深圳市富鹏达金属材料有限公司电话号码:13556896920,自2008年成立以来,始终专注于金属材料领域,尤其在不锈钢带制…

10-30 题

10-30 题 Joke - 题目 - QOJ.ac 先把 \(q\) 按照 \(p\) 排序,这样不会影响答案。 先假设我们已知所有的 \(q_i\),怎么求合法 \(s\) 的方案数。考虑把 \((i,q_i)\) 画到二维平面上,那么我们可以画一条不降的折线表示…

微信支付经验总结

首先微信下载的几个证书需要区分好:apiclient_cert.p12( 证书 + 私钥 的 PKCS12 容器,win可以直接执行)、apiclient_cert.pem(商户API证书-公钥)、apiclient_key.pem(商户API证书-私钥)之前遇到前端那调微信支付…

2025年ITSM平台演进趋势与选型指南:大模型智能体引领、数据AI底座支撑、业务价值驱动运维决策

2025年ITSM平台演进趋势与选型指南:大模型智能体引领、数据AI底座支撑、业务价值驱动运维决策$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");2025年IT服务…

2025年专业三防漆厂家排名:三防漆厂商技术实力深度剖析

TOP1推荐:佛山市鲸鲨化工有限公司评价指数:★★★★★ 口碑评分:99分 行业表现:A+++++级佛山市鲸鲨化工有限公司成立于1961年,是新中国成立后全国早批集涂料、合成树脂和颜料的研发、生产、销售于一体的国家重点精…

国标GB28181算法算力平台EasyGBS录像 “罢工”?就因没注意这个默认设置!

国标GB28181算法算力平台EasyGBS录像 “罢工”?就因没注意这个默认设置!今天跟大伙儿唠个实用的——你们有没有在EasyGBS平台上设好录像计划,结果它就是不干活儿的情况?其实啊,问题出在一个特小的细节上,好多人都…

2025年度口碑好的尼龙垫块制造企业TOP5:探寻尼龙垫块生产厂的创新能力与服务态度

在橡塑科技领域,尼龙垫块凭借其独特的性能和广泛的应用,正受到越来越多企业的关注。对于像河北春源橡塑科技有限公司这样的企业而言,如何在竞争中脱颖而出,成为口碑好的尼龙垫块制造企业,创新能力与服务态度起着关…