我有一个可以在标准网络托管环境和Google App Engine上运行的网站/应用。所以我在Cloud9上开发,将测试版本(通过GitHub)部署到appspot.com URL,最终部署到与自定义域关联的GAE项目。
我希望在开发网站上完全禁止网络抓取工具,并在生产网站上指定访问权限。但我不想承担管理不同版本的robot.txt文件的任务。
我开发的内容将在下面发布。也许它会对其他人有所帮助,或者某人有更优雅的解决方案。
P.S。我读到了最合适的礼仪,因为有人会问并立即回答他们自己的问题。意见分歧主要分为那些认为答案应该保留在问题中的人(以便看起来不像是试图提高自己的声誉)而不是发布官方答案。我选择后者是基于这样的逻辑:如果一个人正在寻找答案并看到一个有0个答案的帖子,他们就不会知道他们可能会考虑一个解决方案。
答案 0 :(得分:0)
我的解决方案是让PHP生成响应。
由于我没有其他理由提供文本文件,因此修改app.yaml文件,以便对任何.txt扩展名的请求触发主脚本(index.php包含)...
- url: /(.*\.(txt$))
script: index.php
PHP脚本解析URL ...
$argument = basename(parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH));
if ($argument !== "" && $argument !== "index.php") {
if ($argument == "robots.txt") {
$action = "answerRobot";
}
elseif ($argument == "_________") {
// Other things I look for such as translating directory
// requests into actions. For instance website.com/admin
// (a non-existent directory) triggers an admin function
// in the main script.
}
}
然后我检查一下我所处的环境 - 首先是我在GAE中运行然后是哪个项目...
if (strpos(getcwd(), "/base/data/home/apps/s~____") > -1) {
$appEngine = true;
if (strpos($_SERVER["APPLICATION_ID"], "dev") > -1) {
$crawlable = false;
}
else {
$crawlable = true;
}
}
最后,如果需要,我会生成robots.txt内容......
if ($action == "answerRobot") {
header("Content-type: text/plain");
if ($crawlable) {
$content = "User-agent: *"
. "\nDisallow: /code/"
. "\nDisallow: /icons/"
. "\nDisallow: /specific_file.ext"
. "\nDisallow: /specific_file.ext"
;
}
else {
$content = "User-agent: *"
. "\nDisallow: /"
;
}
echo $content;
exit();
}