为ASP.NET Core网站动态创建robots.txt

现在,我正在将网站上的某些旧WebForm(目前正在裸机上运行)转移到ASP.NET Core和Azure应用程序服务中。 在此过程中,我意识到我想确保自己的网站未在Google,Yandex,Bing和其他搜索引擎中建立索引。


我已经有一个robots.txt文件,但我希望其中一个仅用于生产,而另一个用于开发。 我正在想办法解决这个问题。 我可以拥有一个静态robots.txt文件,一个robots-staging.txt文件,并在我的Azure DevOps CI / CD管道中有条件地一个复制一个。


然后我意识到最简单的事情是使robots.txt动态化。 我当时在考虑编写自己的中间件,但这似乎很麻烦,需要编写大量代码。 我想看看它有多简单。




  • 您可以将其实现为嵌入式中间件:只需一行中的lambda,func和linq
  • 您可以编写自己的中间件并进行很多选择,然后在env.IsStaging()或其他环境中激活它
  • 您可以使用TegHelpers环境创建一个Razor页面

最后一个选项似乎最简单,这意味着无需完全重新编译就可以更改cshtml,因此我创建了一个Razor Page RobotsTxt.cshtml。 然后,我使用内置的标记环境助手来有条件地生成文件的各个部分。 另请注意,我强制将mime类型设置为文本/纯文本,并且不使用“布局”页面,因为它必须是独立的。


@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标记在完成其工作时有时会“消失”(删除),但周围仍然留有空隙。 因此,我希望用户代理:*有一行,然后Disallow 将立即出现在下一行。 尽管如果源代码在不同的行开始,则源代码可能会更漂亮,但这将是错误的文件。 我希望结果是正确的。 这是为了理解:


 User-agent: * Disallow: / 

这给了我/ robotstxt中的robots.txt文件,但没有给/robots.txt中的文件。 看到错误了吗? Robots.txt是一个(伪)文件,因此我需要将从请求到/robots.txt的路由映射到名为RobotsTxt.cshtml的Razor页面。


在这里,我使用自定义PageRoute将RazorPagesOptions添加到我的Startup.cs中,该自定义PageRoute将/robots.txt映射到/ robotstxt。 (我总是发现此API很烦人,因为我认为应将参数更改为(“ from”,“ to”),因此请确保不要像我刚才那样花十分钟) 。


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

仅此而已! 简单透明。


您还可以根据需要将缓存添加为更大的中间件,甚至可以添加到cshtml页面上


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

但我将把这种优化作为练习留给您。


更新:完成后,我在GitHub上找到了中间件robots.txt和NuGet。 我仍然对我的代码感到满意,并且不介意没有外部依赖(外部独立对我来说并不重要),但是将其保留在将来更复杂的任务和项目中是很好的。


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


All Articles