php不直接控制crawl-delay,但可动态生成robots.txt内容以差异化响应爬虫;需配合nginx限速(如limit_req)才能真正约束高频访问,因crawl-delay仅为建议,恶意爬虫无视。

PHP本身不直接生成或控制Crawl-delay字段——这个字段只存在于静态robots.txt文件中,是供爬虫主动读取并遵守的提示性指令,而非服务器可强制执行的规则。但你可以用PHP动态生成robots.txt内容,根据请求来源(如User-Agent)返回差异化的Crawl-delay值,从而引导合规爬虫按你期望的节奏抓取。
一、用PHP动态输出robots.txt(核心做法)
将网站根目录的robots.txt请求重写到robots.php,由PHP决定返回什么内容:
Nginx配置示例(宝塔/自建环境均适用):
rewrite ^/robots\.txt$ /robots.php last;
robots.php 示例代码:
<?php header('Content-Type: text/plain; charset=utf-8');
$user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
if (stripos($user_agent, 'Googlebot') !== false) {
echo "User-agent: Googlebot\n";
echo "Crawl-delay: 5\n";
echo "Allow: /\n";
} elseif (stripos($user_agent, 'Baiduspider') !== false) {
echo "User-agent: Baiduspider\n";
echo "Crawl-delay: 10\n";
echo "Allow: /\n";
} elseif (stripos($user_agent, 'YandexBot') !== false) {
echo "User-agent: YandexBot\n";
echo "Crawl-delay: 7\n";
echo "Allow: /\n";
} else {
// 默认规则:不限制,或限制更宽松
echo "User-agent: *\n";
echo "Crawl-delay: 3\n";
echo "Disallow: /admin/\n";
echo "Disallow: /api/\n";
}
?>
✅ 这样做的好处:
- 百度蜘蛛看到
Crawl-delay: 10,会自动每10秒最多抓1个页面;- Googlebot看到
Crawl-delay: 5,则按5秒间隔抓取;- 其他爬虫走默认策略,避免一刀切误伤。
二、配合Nginx限速,真正管住高频行为
⚠️ 注意:Crawl-delay只是“建议”,恶意爬虫(如Scrapy、curl脚本)根本不会读它。所以必须叠加服务端限速:
在Nginx server块顶部添加:
map $http_user_agent $is_search_spider {
~*Googlebot 1;
~*Baiduspider 1;
~*YandexBot 1;
default 0;
}
limit_req_zone $is_search_spider zone=spider:10m rate=2r/s;
在location /中启用:
limit_req zone=spider burst=5 nodelay;
? 效果:
- 合法搜索引擎(标记为
1)被限为平均2次/秒,允许短时5次突发;- 其他UA(
$is_search_spider=0)不受此zone限制,可另设IP级限流;- 不依赖
if判断,避免Nginx静默失效。
三、补充提醒:别只靠Crawl-delay防攻击
-
Crawl-delay对CC攻击、扫描工具、伪造UA的爬虫完全无效; - 真正要防刷,得靠Nginx
limit_req(按IP或UA)、PHP+Redis计数(如每分钟100次)、或WAF拦截; - 如果发现某UA频繁触发429/503,可在
robots.php里对它返回Disallow: /或空白内容,变相降低其抓取意愿。
不复杂但容易忽略:Crawl-delay是礼貌,Nginx限速才是底线。两者搭配,既尊重搜索引擎,又守住服务器。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











