PDF、Zip 等大文件通常是流量消耗的“重灾区”。如果被搜索引擎或恶意爬虫频繁抓取,不仅白白浪费带宽,还会造成不必要的磁盘 I/O。本文分享如何结合 Nginx 的 map 变量,精准拦截所有针对 PDF 的抓取行为。
1. 为什么 PDF 需要特殊防护?
- 体积大:一个 PDF 动辄几 MB 甚至上百 MB。
- 多线程抓取:很多爬虫支持断点续传,会开启多个线程反复请求文件的不同分片,瞬间榨干带宽。
- SEO 无用论:如果你的 PDF 只是附件,被搜索引擎收录反而可能分走主页的权重。
2. 配置实现:PDF 专属拦截块
在你的站点配置文件(.conf)中,加入以下针对性逻辑。请确保此段代码位于 PHP 处理逻辑之前。
# 拦截所有 PDF 文件的抓取请求
location ~* \.pdf$ {
# 1. 命中自定义黑名单 (is_bad_bot) 直接掐断
if ($is_bad_bot) {
return 444;
}
# 2. 拦截所有包含 spider/bot 关键字的通用爬虫
# ~* 表示不区分大小写的正则匹配
if ($http_user_agent ~* "spider|bot|crawl|slurp|sohu-search|lycos|robozilla") {
return 444;
}
# 3. 正常用户:设置过期时间并强制下载(可选)
expires 30d;
add_header Content-Disposition "attachment";
}
3. 技术解析:双重防线
- 第一道防线(is_bad_bot):利用我们在主配置文件中定义的
map变量,拦截那些已知的流氓工具(如 AhrefsBot)。 - 第二道防线(正则过滤):通过简单的正则
spider|bot,将所有自称是“机器人”的请求一网打尽。 - 返回 444 的精妙之处:与
403不同,444直接关闭 TCP 连接。爬虫连文件头(Header)都拿不到,更无法得知文件的大小,从而彻底打消了它继续抓取的念头。
4. 辅助手段:robots.txt
虽然 Nginx 已经“物理隔离”了请求,但为了更文明地引导搜索引擎,建议在根目录的 robots.txt 中同步声明:
User-agent: *
Disallow: /*.pdf$
总结
通过 Nginx 规则将 PDF 文件请求重定向至 444 黑洞,是保护服务器带宽最直接、最粗暴但也最有效的方法。这不仅能有效防范恶意扫描,还能让有限的带宽资源真正服务于正常用户。
作者:霍欣标,如若转载,请注明出处:https://www.bigengwu.cn/shu/367.html