nginx通过rewrite将/s/{code}透传为/api/seckill?short_code={code},由后端查redis/db动态解析;限制码长防遍历,配合limit_req限流、302跳转及参数校验保障安全。

网购秒杀系统中,用 Nginx 实现短路径(如 /s/abc123)动态解析为真实商品或活动接口(如 /api/seckill?item_id=10086),核心是结合 rewrite 指令与后端服务协同完成——Nginx 不直接查数据库,而是把短码提取后透传给业务层处理。
短路径规则定义与基础 rewrite 配置
将 /s/{code} 统一重写为带查询参数的内部路径,便于后端识别:
- 在 server 块中添加:
rewrite ^/s/([a-zA-Z0-9]{4,12})$ /api/seckill?short_code=$1 break; -
break表示停止当前 location 的 rewrite 处理,不发起新匹配;若需转发到另一 upstream,可用proxy_pass+rewrite配合 - 正则中限制码长(4–12 位字母数字)可防恶意遍历,也适配常见短链生成策略
配合后端实现动态路由解析
Nginx 仅做轻量解析,真实映射逻辑由后端完成:
- 后端收到
short_code=abc123后,查缓存(Redis)获取对应item_id、活动 ID、有效期等 - 若缓存未命中,再查 DB 并回填缓存;过期或无效码返回 404 或跳转首页
- 不建议在 Nginx 中用
map或 Lua 做全量映射——秒杀场景下短码量大、更新频繁,会拖慢 Nginx 性能
支持跳转型短链(302 重定向)
对需要浏览器地址栏显示真实路径的场景(如分享页),用临时重定向:
-
rewrite ^/s/([a-zA-Z0-9]{4,12})$ /item/$1?from=short permanent;→ 301(慎用,不利于 AB 测试) -
rewrite ^/s/([a-zA-Z0-9]{4,12})$ https://shop.example.com/seckill?code=$1 redirect;→ 302,更灵活 - 注意:302 会暴露真实 URL,敏感活动建议走内部透传 + 前端 SPA 路由接管
安全与限流前置处理
短路径易被暴力探测,需在 rewrite 前加固:
- 用
limit_req控制单 IP 短码请求频次,例如每秒最多 5 次:limit_req zone=short_limit burst=10 nodelay; - 对非 GET 请求(如抢购提交)严格校验 Referer 或加签 token,避免 rewrite 后绕过鉴权
- 可配合
if ($args !~ "short_code=") { return 403; }阻断非法参数构造











