【问题标题】:How can I manage robots.txt in Azure app service with a staging slot如何使用暂存槽管理 Azure 应用服务中的 robots.txt
【发布时间】:2017-12-13 19:05:23
【问题描述】:

我有一个在 Azure 应用服务中运行的 ASP.NET MVC 应用,它有一个暂存槽,以及VSTS 中的构建和发布管道。

我希望生产实例始终在 robots.txt 中包含 Allow /,在暂存槽中始终包含 Disallow /

目前我们每次进行交换时都会手动更改 robots.txt,但这很容易出错

如何使这个过程自动化?

为了解决这个问题,我确实考虑过根据 Azure 门户中设置的应用程序设置动态创建 robots.txt 文件(设置为保留在插槽中),但这不起作用,因为在交换发生后 prod 将具有暂存Disallow 规则。

谁能建议最好的管理方法?

【问题讨论】:

    标签: asp.net asp.net-mvc azure azure-devops


    【解决方案1】:

    搜索引擎主要使用机器人来抓取和检查公共网站上的页面。暂存和其他部署槽不是公开的(也不应该公开——除非你有充分的理由),因此配置和管理它没有多大意义。其次,在大多数情况下,我会建议将任何 public 请求重定向到您的生产槽,并保持离线暂存并仅在内部用例中处于活动状态。这也将帮助您管理仅来自公众的分析和日志,而不会被内部和部署槽的东西污染。

    无论如何,如果您仍然倾向于这样做,那么您可以通过一种方法来管理它。编写您自己的路由来控制 robots 文件,然后渲染一个 content-type: text/plain 页面,该页面将根据是暂存请求还是生产请求是动态的。像这样的,

    // Create the robots.txt file dynamically, by controlling the URL handler
    [Route("robots.txt")]
    public ContentResult DynamicRobotsFile()
    {
        StringBuilder content = new StringBuilder();
        content.AppendLine("user-agent: *");
    
        // Check the condition by URL or Environment variable
        if(allow) {
            content.AppendLine("Allow: /");
        else {
            content.AppendLine("Disallow: /");
        }
    
        return this.Content(stringBuilder.ToString(), "text/plain", Encoding.UTF8);
    }
    

    通过这种方式,您可以管理 robots.txt 的创建方式,并且可以控制机器人的允许禁止。您只能在应用的主控制器中创建单独的控制器或操作。

    现在您知道如何操作了,您可以为生产/暂存槽设置环境变量以检查其他要求。

    【讨论】:

    • 谢谢。这个路由应该去哪里?我尝试将它放在HomeController 上的测试应用程序中并设置断点,但是当我浏览到localhost:8888/robots.txt 时它没有被击中。你能帮我理解为什么吗?
    • 如果您使用的是旧版 ASP.NET MVC,那么您还需要在 web.config 文件中配置此路由,请查看此处stackoverflow.com/questions/17160744/…
    【解决方案2】:

    我使用下面的代码,它对我有用

    [Route("robots.txt")]
    public ContentResult DynamicRobotsFile()
    {
         StringBuilder content = new StringBuilder();
    
         if (System.Configuration.ConfigurationManager.AppSettings["production"] != "true")
         {
             content.AppendLine("user-agent: *");
             content.AppendLine("Disallow: /");
         }
    
        return this.Content(content.ToString(), "text/plain", Encoding.UTF8);
    }
    

    web.config

      <appSettings>    
          <add key="production" value="false" />
      </appSettings>
    
    
      <system.webServer>
         <handlers>
           <add name="RobotsTxt" path="robots.txt" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
         </handlers>
      </system.webServer>
    

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 2019-12-02
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多