gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:26:53 25 4
gpt4 key购买 nike

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

我想包含一个 robots.txt 文件,我想根据域本地化 robots.txt 文件,但我知道在站点的文件系统目录中我只能有一个物理“robots.txt”文本文件。

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

最佳答案

这个过程相当简单:

Controller / Action 方法

  • 使用你的路由表,将你的 robots.txt 路径映射到 Controller 中的一个 Action (我使用 Controller 和 Action 作为一个简单的例子来让你开始),就像你对给定路径的任何其他 Controller 和 View 一样。
  • 在操作中,检查请求中的域并为该域选择 robots.txt 内容。
  • 使用以下内容从磁盘返回适当的文件:
  • ContentResult 并设置 ContentType"text/plain"
  • FilePathResult 如果您的机器人文件只是磁盘上的文件,请通过 Controller 上的帮助方法之一类如 File(name, "text/plain")

  • 以下示例假设有一个顶级 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");
    }
    }

    使其工作的最简单方法之一是确保使用 runAllManagedModulesForAllRequests 为所有请求调用路由模块。在 web.config 中(不要使用它,请参阅下一段):

    <system.webServer>
    <handlers>
    ...
    </handlers>
    <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>

    这通常不是一件好事,因为现在所有静态文件(css、js、txt)在被转移到静态文件处理程序之前都经过托管处理程序。 IIS 非常擅长快速提供静态文件(一个主要是静态文件的网站会在 CPU 之前最大化您的磁盘 I/O 方式),因此为了避免这种性能下降,推荐的方法是下面的 web.config 示例部分。请注意与 ExtensionlessUrlHandler-Integrated-4.0 的相似性Visual Studio MVC 4 模板应用程序中的处理程序:

    <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 文件中。
  • 您可以检查机器人用户代理以针对每个机器人用户代理返回不同的机器人文件
  • 您可以使用相同的 Controller 为网络爬虫输出sitemap.xml 文件
  • 您可以从一个可由站点用户轻松管理的数据库表中管理机器人内容。

  • 不利的一面是,
  • 您的 robots 文件现在使您的路由表变得复杂,而且它实际上并不需要
  • 您将需要优化缓存以防止持续的磁盘读取。但是,这对于您采用的任何方法都是一样的。

  • 另请记住,不同的 robots.txt 文件可用于不同的子目录。这在路由和 Controller 方法中变得棘手,因此 IHttpHandler对于这种情况,方法(如下)更容易。

    IHttpHandler 方法

    您也可以使用自定义 IHttpHandler 执行此操作 registered in your web.config .我强调自定义,因为这避免了让所有 Controller 看到所有请求的需要(使用 runAllManagedModulesForAllRequests="true",不像在路由表中添加自定义路由处理程序。

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

    <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

    要为子目录和站点根目录提供机器人服务,您不能轻松地使用 Controller 方法;在这种情况下,处理程序方法更简单。这可以配置为接收对任何子目录的 robots.txt 文件请求并相应地处理它们。然后,您可以选择为某些目录返回 404,或为其他目录返回 robots 文件的子部分。

    我在这里特别提到这一点,因为这种方法也可以用于 sitemap.xml 文件,为站点的不同部分提供不同的站点地图,多个相互引用的站点地图等。

    其他引用资料:
  • Scott Hanselman: Back to Basics: Dynamic Image Generation, ASP.NET Controllers, Routing, IHttpHandlers, and runAllManagedModulesForAllRequests
  • MSDN - How to: Register HTTP Handlers
  • 关于asp.net-mvc-4 - 同一站点不同域的robots.txt文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17033779/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com