【发布时间】:2012-12-29 17:12:56
【问题描述】:
我一直遵循from this article 的建议,在 asp.net mvc3 中设置 robots.txt 文件以使用控制器处理服务器响应,而 IIS 8.0 express 返回文件未找到错误,而不是asp.net 错误。
在这些情况下,如何让 IIS 不查找文件? web.config 中有我需要的东西吗?
【问题讨论】:
标签: asp.net-mvc-4 asp.net-mvc-routing
我一直遵循from this article 的建议,在 asp.net mvc3 中设置 robots.txt 文件以使用控制器处理服务器响应,而 IIS 8.0 express 返回文件未找到错误,而不是asp.net 错误。
在这些情况下,如何让 IIS 不查找文件? web.config 中有我需要的东西吗?
【问题讨论】:
标签: asp.net-mvc-4 asp.net-mvc-routing
IIS 在这里尝试变得智能。他截取了 url 中的点,并认为这是一个静态文件,并尝试使用默认的 StaticFile 处理程序来提供它。它不会让事件到达托管的 ASP.NET 应用程序。
第一种可能性是在您的 web.config 中添加以下内容
<system.webserver>
<modules runAllManagedModulesForAllRequests="true" />
但实际上我不建议您这样做,因为这可能会对您的应用程序的性能产生负面影响,因为现在所有对静态文件(例如 .js、.css、图像...)的请求都会消失通过托管管道。
推荐的方法是将以下处理程序添加到您的web.config(<system.webServer> 的<handlers> 标记):
<system.webServer>
<handlers>
<add name="Robots-ISAPI-Integrated-4.0" path="/robots.txt" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
...
</handlers>
</system.webServer>
请注意我们如何指定此处理程序仅适用于特定 URL 和 HTTP 动词。
现在,当您 GET /robots.txt 时,IIS 将不再使用 StaticFile 处理程序处理它,而是将其传递给托管管道 ASP.NET。然后会被路由引擎拦截,路由到对应的控制器action。
【讨论】:
除非您需要动态生成的 robots.txt 文件(这很少需要),否则只需执行以下操作:
忽略到 robots.txt 的路由
routes.IgnoreRoute("robots.txt");
将 robots.txt 文件添加到您的根目录
【讨论】:
web.config 更改)。