我有一个在Azure应用服务中运行的ASP.NET MVC应用程序,其中包含一个临时插槽,以及Profiles
中的构建和发布管道。
我希望生产实例始终在暂存插槽中的robots.txt和VSTS
中有Allow /
。
目前我们每次进行交换时都会手动更改robots.txt,但这很容易出错
如何自动完成此过程?
为了解决这个问题,我考虑过根据Azure门户中设置的应用程序设置动态创建robots.txt文件(设置为保留在插槽中),但是这在交换发生后不会起作用prod将有暂存Disallow /
规则。
有人可以建议最好的方法来管理吗?
答案 0 :(得分:5)
搜索引擎主要使用机器人来抓取和检查公共网站上的网页。暂存和其他部署插槽不是公共的(并且不应该是公共的 - 除非您有充分的理由),因此配置和管理它没有多大意义。其次,在大多数情况下,我会建议将任何公共请求重定向到您的生产广告位,并仅针对内部用例保持暂存和暂停。这也可以帮助您管理仅来自公众的分析和日志,而不会受到内部和部署插槽内容的污染。
无论如何,如果你仍然倾向于这样做,那么有一种方法可以解决这个问题。编写自己的路由来控制机器人文件,然后呈现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的创建方式,并且您可以控制机器人的禁止权限。您只能在应用程序的主控制器中创建单独的控制器或操作。
现在您知道该怎么做了,您可以设置生产/临时插槽的环境变量来检查其他要求。
答案 1 :(得分:0)
我使用下面的代码,它适用于我
[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>