根据环境为ASP.NET Core网站动态生成robots.txt

我将仍旧在裸机上运行的网站的旧WebForms部分的一部分放到ASP.NET Core和Azure App Services中,在这样做的同时,我意识到我想确保我的暂存站点不会出现被Google / Bing索引。


我已经有一个robots.txt,但是我想要一个特定于生产的机器人,另一个特定于开发或登台的机器人。 我考虑了多种解决方法。 我可以有一个静态robots.txt和另一个robots-staging.txt,并在我的Azure DevOps CI / CD管道中有条件地一个复制一个。


然后,我意识到最简单的方法就是使robots.txt动态化。 我考虑过编写自定义中间件,但这听起来很麻烦,需要更多代码。 我想看看这有多简单。




  • 您可以将其作为单个内联中间件来完成,而lambda和func和linq只需一行就可以了
  • 您可以编写自己的中间件并做很多选择,然后在env.IsStaging()等上激活它。
  • 您可以使用环境taghelpers制作一个Razor Page。

最后一个似乎最简单,这也意味着我可以在不进行完全重新编译的情况下更改cshtml,因此我制作了RobotsTxt.cshtml单个剃须刀页面。 没有页面模型,没有代码。 然后,我使用内置的环境标签帮助程序有条件地生成文件的各个部分。 还要注意,我将mime类型强制设置为text / plain,并且我不使用“布局”页面,因为这需要单独使用。


@page @{ Layout = null; this.Response.ContentType = "text/plain"; } # /robots.txt file for http://www.hanselman.com/ User-agent: * <environment include="Development,Staging">Disallow: /</environment> <environment include="Production">Disallow: /blog/private Disallow: /blog/secret Disallow: /blog/somethingelse</environment> 

然后,确保我的登台和/或生产系统具有适当设置的ASPNETCORE_ENVIRONMENT变量。


ASPNETCORE_ENVIRONMENT=Staging

我还想指出看起来像是奇数行距的内容,以及一些文本如何与TagHelpers对接。 请记住,TagHelper的标签在完成处理后有时会“消失”(消失),但是标签周围的空白仍然存在。 所以我希望User-agent:*有一行,然后禁止在下一行立即显示。 虽然以另一行开头可能是更漂亮的源代码,但它不是正确的文件。 我希望结果严格,最重要的是,正确。 这是分期进行的:


 User-agent: * Disallow: / 

现在,我在/ robotstxt处获得了robots.txt,但在/robots.txt中却找不到了。 看到问题了吗? Robots.txt是一个文件(或伪造的文件),因此我需要将一条路径从对/robots.txt的请求映射到名为RobotsTxt.cshtml的Razor页面。


在这里,我在Startup.cs中添加了带有自定义PageRoute的RazorPagesOptions,该自定义PageRoute将/robots.txt映射到/ robotstxt。 (我一直发现这个API很烦人,因为恕我直言,参数应该像(“ from”,“ to”)那样反转,因此请当心,以免您像我一样浪费十分钟。


 public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddRazorPagesOptions(options => { options.Conventions.AddPageRoute("/robotstxt", "/Robots.Txt"); }); } 

就是这样! 简单干净。


您还可以根据需要添加缓存,作为较大的中间件,甚至在cshtml Page中,例如


 context.Response.Headers.Add("Cache-Control", $"max-age=SOMELARGENUMBEROFSECONDS"); 

但我会将小优化作为练习留给读者。


更新:完成后,我在GitHub上找到了robots.txt中间件和NuGet。 我仍然对我的代码感到满意,并且不介意没有外部依赖关系,但是很高兴将其归档以备将来更复杂的需求和项目使用。



您如何处理robots.txt的需求? 你甚至有一个吗?

Source: https://habr.com/ru/post/zh-CN457208/


All Articles