最有效方式是在nginx的server或location块中拦截非法pragma头:仅允许空值或严格等于no-cache,其余返回403;并配合cache-control做一致性校验,防止绕过;cdn回源通常不带pragma,故公网带非空pragma请求可判为非法直连。

直接在 Nginx 的 server 或 location 块中拦截带有非法或可疑 Pragma 请求头的请求,是最有效的方式。因为 Pragma: no-cache 本身是 HTTP/1.0 兼容字段,常被客户端(尤其是老旧爬虫、测试工具或恶意脚本)滥用,绕过 CDN 缓存直连源站,造成回源压力甚至缓存污染。
识别并拒绝非法 Pragma 头
HTTP 标准中,Pragma 仅合法值为 no-cache(且应与 Cache-Control: no-cache 配合使用)。但攻击者常伪造如 Pragma: refresh、Pragma: bypass、Pragma: force 等非标值来试探源站行为。Nginx 可用 if + 正则精准拦截:
- 在
server块内添加:if ($http_pragma !~ ^$|^no-cache$) { return 403; } - 该规则含义:只允许
Pragma头为空(即未携带)或严格等于no-cache;其余全部返回 403。 - 注意:
$http_pragma是 Nginx 自动映射的变量,不区分大小写,无需额外转换。
配合 Cache-Control 做一致性校验
单拦 Pragma 不够稳健——攻击者可能只发 Cache-Control: no-cache 而不带 Pragma。建议同步校验二者逻辑是否自洽:
- 若
Pragma: no-cache出现,但Cache-Control缺失或不含no-cache/max-age=0,可视为可疑: - 用
map构建组合判断变量(更高效,避免多层 if):map "$http_pragma:$http_cache_control" $bad_cache_hint { default 0; "no-cache:" 1; "no-cache:private" 1; "no-cache:max-age=3600" 1; ~*":.*no-cache" 0; ~*":.*max-age=0" 0; } - 然后在 server 中:
if ($bad_cache_hint) { return 403; }
特别注意 CDN 回源场景
如果你的源站对接了华为云/阿里云等 CDN,它们回源时通常**不会携带 Pragma 头**(CDN 自身控制缓存逻辑)。因此,任何来自公网且带非空 Pragma 的请求,基本可判定为非 CDN 节点直连——属于非法回源或探测行为:
- 可进一步结合
geo+map,仅对已知 CDN 回源 IP 段放行Pragma(极少需要),其余一律拦截; - 同时确保你已按规范配置了 华为云 CDN 回源白名单 或 阿里云 CDN 回源 Referer/Host 校验,形成双重防线。
不推荐的做法
不要试图用 proxy_set_header Pragma "" 清除该头再转发——这治标不治本,且可能干扰正常业务逻辑;也不要用 rewrite 重定向处理,因为 Pragma 是请求控制头,不是路径问题。拦截必须发生在请求进入后端前,由 Nginx 主动拒绝。











