PHP不直接禁止爬虫,而是通过robots.txt告知合规爬虫、Web服务器配置(.htaccess/Nginx)提前拦截、PHP脚本逻辑校验及敏感文件物理隔离四层防护实现有效管控。

PHP本身不直接“禁止”爬虫,而是通过配合服务器规则、HTTP响应、前端控制和逻辑判断,让爬虫无法有效访问或解析指定目录下的文件。重点不是靠PHP单点拦截,而是分层设防——既让合规爬虫知难而退,也让恶意爬虫难以绕过。
用 robots.txt 明确告知合规爬虫
这是最基础也最标准的方式,适用于所有遵守协议的搜索引擎爬虫(如百度、Google)。
- 在网站根目录新建 robots.txt 文件,内容示例:
Disallow: /admin/
Disallow: /private/
Disallow: /api/v1/
上面规则表示:禁止所有爬虫访问 /admin/、/private/ 和 /api/v1/ 目录。注意路径末尾斜杠代表“目录”,不加斜杠可能匹配不准确。
⚠️ 注意:该文件仅起“君子协定”作用,恶意爬虫可无视。但它成本低、无性能损耗,必须配置。
立即学习“PHP免费学习笔记(深入)”;
用 .htaccess(Apache)或 Nginx 配置直接拦截请求
比 PHP 更早介入请求流程,效率高,且对静态资源(如 .php、.json、.txt)同样生效。
- Apache(.htaccess) 示例(放在要保护的目录下或根目录):
RewriteCond %{REQUEST_URI} ^/admin/ [OR]
RewriteCond %{REQUEST_URI} ^/private/
RewriteCond %{HTTP_USER_AGENT} !(Googlebot|Bingbot|YandexBot) [NC]
RewriteRule ^ - [F,L]
含义:当请求路径匹配 /admin/ 或 /private/,且 User-Agent 不是主流搜索引擎时,返回 403 Forbidden。
- Nginx(server 块内) 示例:
deny all;
}
location ^~ /private/ {
deny all;
}
更严格的做法还可结合 if ($http_user_agent ~* "python|curl|scrapy|wget") { return 403; } 进行 UA 层过滤。
用 PHP 脚本统一入口做逻辑拦截
适合动态生成内容的目录(如 /download/ 下的 PHP 脚本),或需结合登录态、权限判断的场景。
- 在目标目录的每个 PHP 文件开头加入校验逻辑,例如:
// 拦截非浏览器 UA
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
if (empty($ua) || preg_match('/bot|crawl|spider|curl|python|wget/i', $ua)) {
http_response_code(403);
die('Access denied.');
}
// 可选:进一步检查 Referer、Session 登录态等
?>
若整个目录都需保护,可在该目录下放一个 index.php 作为唯一入口,其他文件设为不可直接访问(配合 Web 服务器配置)。
物理隔离 + 服务器权限限制(最稳妥)
真正杜绝“被读取”的风险,尤其适用于敏感配置、原始数据文件等。
- 将敏感文件(如
config.php、data.csv)移出 Web 根目录(如放到/var/www/private/),确保 Web 服务器无法通过 URL 访问; - PHP 脚本通过绝对路径包含或读取,但绝不暴露 URL 路径;
- 在 Apache/Nginx 中明确禁止访问常见敏感后缀:
Require all denied
</FilesMatch>



















