PHP动态生成robots.txt需配置Web服务器重写规则(Apache用RewriteRule,Nginx用location),由robots.php根据环境变量或域名判断输出策略,设置Content-Type: text/plain及禁用缓存头,确保语法规范无错误输出。

PHP动态生成robots.txt文件,核心是让服务器在请求/robots.txt时,不返回静态文件,而是由PHP脚本根据条件(如环境、域名、调试状态等)实时输出符合规范的文本内容,并正确设置Content-Type: text/plain响应头。
配置Web服务器重写规则
让所有对/robots.txt的请求交由PHP处理,而不是直接读取静态文件:
-
Apache(.htaccess):添加规则,优先匹配
robots.txt并重写到PHP脚本
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^robots\.txt$ /robots.php [L] </IfModule>
- Nginx:在server块中添加location匹配
location = /robots.txt {
try_files /robots.php =404;
}
编写robots.php逻辑控制输出
在robots.php中判断当前环境或需求,动态决定是否允许爬虫访问。常见场景包括:开发/测试环境禁止所有爬虫,生产环境允许主流搜索引擎,或按User-agent差异化限制。
- 检查
$_SERVER['HTTP_HOST']或自定义环境变量(如$_ENV['APP_ENV']) - 使用
header('Content-Type: text/plain; charset=utf-8');确保浏览器和爬虫正确解析 - 输出标准robots.txt语法,每行一条指令,空行分隔分组
<?php
header('Content-Type: text/plain; charset=utf-8');
$env = $_ENV['APP_ENV'] ?? 'production';
$host = $_SERVER['HTTP_HOST'] ?? '';
// 开发/测试环境一律禁止所有爬虫
if (in_array($env, ['local', 'dev', 'staging'])) {
echo "User-agent: *\n";
echo "Disallow: /\n";
exit;
}
// 生产环境:允许主流爬虫,禁止敏感路径
echo "User-agent: *\n";
echo "Disallow: /admin/\n";
echo "Disallow: /api/\n";
echo "Disallow: /wp-admin/\n";
echo "\n";
echo "User-agent: Googlebot\n";
echo "Allow: /\n";
避免缓存导致策略失效
动态生成的内容容易被CDN、反向代理或浏览器缓存,导致爬虫读到过期规则。需主动禁用缓存:
立即学习“PHP免费学习笔记(深入)”;
- 添加Cache-Control和Expires头,强制不缓存
- 可选加上Last-Modified(设为当前时间),避免304协商缓存
header('Cache-Control: no-cache, no-store, must-revalidate, max-age=0');
header('Expires: Sat, 01 Jan 2000 00:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
验证与注意事项
上线前务必验证输出是否符合robots.txt语法,且无PHP错误或空白字符干扰:
- 直接访问
https://yoursite.com/robots.txt,查看源码是否纯文本、无HTML或PHP错误 - 用Google Search Console的“robots.txt测试工具”校验语法和抓取权限
- 确保PHP脚本无意外输出(如BOM头、前置空格、警告信息),否则会导致解析失败
- 若站点有多个子域,注意
robots.php是否部署到位,或通过Host判断分发不同规则



















