如何在Google App Engine(PHP)上拥有robots.txt的开发和生产版本?

时间:2016-08-31 19:24:51

标签: php google-app-engine robots.txt

我有一个可以在标准网络托管环境和Google App Engine上运行的网站/应用。所以我在Cloud9上开发,将测试版本(通过GitHub)部署到appspot.com URL,最终部署到与自定义域关联的GAE项目。

我希望在开发网站上完全禁止网络抓取工具,并在生产网站上指定访问权限。但我不想承担管理不同版本的robot.txt文件的任务。

我开发的内容将在下面发布。也许它会对其他人有所帮助,或者某人有更优雅的解决方案。

P.S。我读到了最合适的礼仪,因为有人会问并立即回答他们自己的问题。意见分歧主要分为那些认为答案应该保留在问题中的人(以便看起来不像是试图提高自己的声誉)而不是发布官方答案。我选择后者是基于这样的逻辑:如果一个人正在寻找答案并看到一个有0个答案的帖子,他们就不会知道他们可能会考虑一个解决方案。

1 个答案:

答案 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();
}