Asp.net mvc 4 同一站点不同域的robots.txt文件

Asp.net mvc 4 同一站点不同域的robots.txt文件,asp.net-mvc-4,seo,robots.txt,Asp.net Mvc 4,Seo,Robots.txt,我有一个ASP.NET MVC 4 web应用程序,可以从多个不同的域访问。该站点基于请求中的域进行完全本地化(概念类似于) 我想包含一个robots.txt文件,并且我想基于域对robots.txt文件进行本地化,但我知道在站点的文件系统目录中只能有一个物理“robots.txt”文本文件 使用ASP.NET MVC框架在每个域上实现robots.txt文件的最简单/最好的方法是什么(甚至可能是什么),以便相同的站点安装为每个域提供内容,但robots文件的内容根据请求的域进行本地化?该过程相

我有一个ASP.NET MVC 4 web应用程序,可以从多个不同的域访问。该站点基于请求中的域进行完全本地化(概念类似于)

我想包含一个robots.txt文件,并且我想基于域对robots.txt文件进行本地化,但我知道在站点的文件系统目录中只能有一个物理“robots.txt”文本文件


使用ASP.NET MVC框架在每个域上实现robots.txt文件的最简单/最好的方法是什么(甚至可能是什么),以便相同的站点安装为每个域提供内容,但robots文件的内容根据请求的域进行本地化?

该过程相当简单:

控制者/行动方法
  • 使用routes表,将robots.txt路径映射到控制器中的一个动作(我使用控制器和动作作为一个简单的示例让您开始),就像您为给定路径映射任何其他控制器和视图一样
  • 在操作中,检查请求中的域并为该域选择robots.txt内容
  • 使用以下方法从磁盘返回相应的文件:
    • 并将
      ContentType
      设置为
      “text/plain”
    • 如果您的robots文件只是磁盘上的文件,请通过
      控制器
      类上的一个助手方法,例如
以下示例假定一个顶级robots.txt文件:

//应用程序启动/RouteConfig中:
公共静态无效注册表项(路由收集路由)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(
名称:“机器人”,
url:“robots.txt”,
默认值:新建{controller=“Seo”,action=“Robots”}
);
//控制员:
公共类SEO控制器:控制器{
公共行动结果机器人(){
var robotsFile=“~/robots default.txt”;
开关(Request.Url.Host.ToLower()){
案例“stackoverflow.com”:
robotsFile=“~/robots so.txt”;
打破
案例“meta.stackoverflow.com”:
robotsFile=“~/robots meta.txt”;
打破
}
返回文件(robotsFile,“text/plain”);
}
}
实现此功能的最简单方法之一是确保使用web.config中的
runAllManagedModulesForAllRequests
为所有请求调用路由模块(不要使用此选项,请参阅下一段):


...
一般来说,这不是一件好事,因为现在所有静态文件(css、js、txt)在转移到静态文件处理程序之前都要经过托管处理程序。IIS非常擅长快速提供静态文件(大部分静态文件网站将在CPU之前最大限度地利用磁盘I/O),因此,为了避免性能受到影响,建议使用下面的web.config示例部分。请注意与Visual Studio MVC 4模板应用程序中的
ExtensionlessUrlHandler-Integrated-4.0
处理程序的相似性:


。我强调自定义,因为这避免了让所有控制器看到所有请求的需要(使用
runAllManagedModulesForAllRequests=“true”
),而不像将自定义路由处理程序添加到路由表中

这也可能是一种比控制器更轻量级的方法,但您必须拥有巨大的站点流量才能注意到这一差异。它的另一个好处是可重用的代码段,您可以用于所有站点。您还可以添加自定义配置部分,以配置robot用户代理/域名/路径到控制器的映射机器人档案




  • 我不认为这个问题应该结束:这是一个与asp.net MVC相关的编程问题,而asp.net管道正是适合解决这类问题的:如何对要提供的内容做出上下文决定。这绝对不是离题。这非常有帮助,感谢Andy给出了这个非常棒的答案。我想补充一点:您需要从根目录中删除robots.txt,否则您将得到500个错误递归深度。我可以问一下什么
    type=“System.Web.Handlers.TransferRequestHandler”
    predition=“integratedMode,runtimeVersionv4.0”
    意思是说?我讨厌在那里看到版本号。这让我觉得升级到新版本时需要重写代码。(而且,令人惊讶的是,我更愿意不这样做。)我同意@JonathanWood的观点,我们如何知道要使用哪些版本号,特别是在云环境中,以及如何处理版本中的更改?