asp.net-mvc-4 – 同一网站的不同域的robots.txt文件
我有一个可以从多个不同域访问的ASP.NET MVC 4 Web应用程序。该网站根据请求中的域完全本地化(在概念上类似于
this question)。
我想添加一个robots.txt文件,我想根据域本地化robots.txt文件,但我知道我在站点的文件系统目录中只能有一个物理“robots.txt”文本文件。 使用ASP.NET MVC框架在每个域的基础上实现一个robots.txt文件是最简单/最好的方法(甚至是可能的),以便相同的站点安装向每个域提供内容,但内容的机器人文件是根据所请求的域进行本地化的? 解决方法
这个过程很简单:
控制器/动作方式 >使用您的路线表,将您的robots.txt路径映射到控制器中的操作(我使用控制器和操作作为一个简单的例子来启动),就像给任何其他控制器和给定路径的视图一样。 > 以下示例假定单个顶级robots.txt文件: // In App_Start/RouteConfig: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "robots",url: "robots.txt",defaults: new { controller = "SEO",action = "Robots" } ); // The controller: public class SEOController : Controller { public ActionResult Robots() { var robotsFile = "~/robots-default.txt"; switch (Request.Url.Host.ToLower()) { case "stackoverflow.com": robotsFile = "~/robots-so.txt"; break; case "meta.stackoverflow.com": robotsFile = "~/robots-meta.txt"; break; } return File(robotsFile,"text/plain"); } } 那么最简单的方法之一就是确保使用web.config中的runAllManagedModulesForAllRequests来调用所有请求的路由模块(请不要使用它,请参见下一段): <system.webServer> <handlers> ... </handlers> <modules runAllManagedModulesForAllRequests="true" /> </system.webServer> 这通常不是一件好事,现在所有的静态文件(css,js,txt)在被转移到静态文件处理程序之前经过托管处理程序。 IIS非常适用于快速提供静态文件(大部分静态文件网站将在CPU之前最大化磁盘I / O方式),因此为避免这种性能受到打击,推荐的方法如下面的web.config示例部分。请注意与Visual Studio MVC 4模板应用程序中的ExtensionlessUrlHandler-Integrated-4.0处理程序的相似性: <system.webServer> <handlers> <add name="Robots-Integrated-4.0" path="/robots.txt" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> ... the original handlers ... </handlers> <modules runAllManagedModulesForAllRequests="false" /> </system.webServer> 优点/缺点 一旦开始使用这种方法,这种方法的优点就会变得显而易见: >您可以通过使用帮助程序生成Action url动态生成robots.txt文件,然后您可以将模板robots.txt文件的全部/部分添加到其中。 在缺点, >您的漫游器文件现在使您的路由表复杂化,并不是真的需要 还要记住,不同的robots.txt文件可以用于不同的子目录。这通过路由和控制器方法变得棘手,所以IHttpHandler方法(下面)对于这种情况来说更容易。 IHttpHandler方法 您还可以使用自定义IHttpHandler registered in your web.config来实现此功能。我强调自定义,因为这样可以避免使所有控制器看到所有请求(使用runAllManagedModulesForAllRequests =“true”),这与在路由表中添加自定义路由处理程序不同。 这也可能是一个比控制器更轻便的方法,但您必须拥有巨大的网站流量才能注意到差异。其他好处是可以使用的代码段,可以用于所有的网站。您还可以添加自定义配置部分来配置机器人用户代理/域名/路径映射到漫游器文件。 <system.webServer> <handlers> <add name="Robots" verb="*" path="/robots.txt" type="MyProject.RobotsHandler,MyAssembly" preCondition="managedHandler"/> </handlers> <modules runAllManagedModulesForAllRequests="false" /> </system.webServer> public class RobotsHandler: IHttpHandler { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { string domain = context.Request.Url.Host; // set the response code,content type and appropriate robots file here // also think about handling caching,sending error codes etc. context.Response.StatusCode = 200; context.Response.ContentType = "text/plain"; // return the robots content context.Response.Write("my robots content"); } } robots.txt在子目录中 要为子目录和站点根目录提供机器人,您无法轻松使用控制器方法;在这种情况下,处理程序方法更简单。这可以配置为将robots.txt文件请求提取到任何子目录,并相应地处理它们。然后,您可以选择为某些目录返回404,或为其他目录返回机器人文件的子部分。 我特别提到这里,因为这种方法也可以用于sitemap.xml文件,为站点的不同部分提供不同的站点地图,多个彼此引用的站点地图等。 其他参考文献: > Scott Hanselman: Back to Basics: Dynamic Image Generation,ASP.NET Controllers,Routing,IHttpHandlers,and runAllManagedModulesForAllRequests (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 你能从ASP.NET 1.1 Web应用程序调用.NET 2.0 COM对象吗?
- asp.net-mvc – 如何在MVC中排除此syntext中的另一个属性[B
- asp.net – 如何为多行TextBox设置maxlength?
- asp.net – 即使我在Windows 8中安装了协议,SignalR也不会使
- asp.net-mvc – 具有.NET MVC 5属性路由的贪婪段
- asp.net – Web API小写路由
- asp.net-mvc – 对MVC中的模型进行条件验证
- Asp.net Mvc 6登录后立即获得用户声明
- asp.net – 无法转换类型为’System.Web.UI.LiteralControl
- ASP.NET Health Monitoring和ELMAH是否相互替代?