无法在 asp.net mvc 中为 robots.txt 映射路由

Unable to map route for robots.txt in asp.net mvc

我正在开发 asp.net mvc 应用程序。我正在为我的应用程序创建 robots.txt 以防止机器人,因为我当前的站点收到许多机器人请求。于是找了这个link,来创建robots.txt。但是当我像这样访问我的应用程序时输入 url、"www.domain.com/robots.txt",它总是返回 404 页面。

这是我在 HomeController 中的操作方法

public ActionResult Robots()
{
    Response.ContentType = "text/plain";
    return View();
}

这是我的机器人视图

@{
    Layout = null;
}

User-agent:*
Disallow:/

我在 RouteConfig

中为 robots.txt 配置了这样的路由
 public static void RegisterRoutes(RouteCollection routes)
 {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            //routes.MapMvcAttributeRoutes();
            routes.MapRoute(
               "Robots.txt",
               "robots.txt",
               new { controller = "Home", action = "Robots" },
               new string[] { "AyarDirectory.Web.Controllers" }
               );

          //other routes
}

但是当我访问此 url、"www.domain.com/robots.txt" 时,它总是返回 404 页面。如何将 robots.txt 正确添加到我的应用程序?

默认情况下,ASP.NET MVC 不允许创建以文件扩展名结尾的路由。要绕过此安全限制,您需要将以下内容添加到 Web.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- ...Omitted -->
  <system.webServer>
    <!-- ...Omitted -->
    <handlers>
      <!-- ...Omitted -->
      <add name="RobotsText"
           path="robots.txt"
           verb="GET"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
</configuration>

会说与上面相同的事情,您需要更改 web.config 以允许带有 .txt 的路由工作。我在做的一个项目中遇到了同样的问题,但我让它工作了。

但是,如果您在没有模型的情况下使用机器人输出视图,您最好保持静态 robots.txt,因为它不会给您带来任何优势。另一种方法是使用字符串生成器直接从操作中输出文本。

在 Asp.net Core 中,您只需将 robots.txt 文件添加到 wwwroot 目录即可。

Nkosi 在 web.config 方法中的 System.Web.Handlers.TransferRequestHandler 方法由于我工作的环境而对我不起作用,导致 500 个错误。

使用 web.config url 重写规则的替代方法对我有用:

<rewrite>
    <rules>
        <rule name="Dynamic robots.txt" stopProcessing="true">
            <match url="robots.txt" />
            <action type="Rewrite" url="/DynamicFiles/RobotsTxt" />
        </rule>
    </rules>
</rewrite>