【问题标题】:url with extension not getting handled by routing带有扩展名的 url 没有被路由处理
【发布时间】: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


    【解决方案1】:

    IIS 在这里尝试变得智能。他截取了 url 中的点,并认为这是一个静态文件,并尝试使用默认的 StaticFile 处理程序来提供它。它不会让事件到达托管的 ASP.NET 应用程序。

    第一种可能性是在您的 web.config 中添加以下内容

    <system.webserver>
        <modules runAllManagedModulesForAllRequests="true" />
    

    但实际上我不建议您这样做,因为这可能会对您的应用程序的性能产生负面影响,因为现在所有对静态文件(例如 .js、.css、图像...)的请求都会消失通过托管管道。

    推荐的方法是将以下处理程序添加到您的web.config(&lt;system.webServer&gt; 的&lt;handlers&gt; 标记):

    <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。

    【讨论】:

    • 有没有办法保持 IIS 处理静态文件的行为,但如果找不到文件,而不是提供 IIS 404 页面,而是将其传递到托管管道以供审查?
    • 啊哈,found it!
    • 注意目标框架的版本
    【解决方案2】:

    除非您需要动态生成的 robots.txt 文件(这很少需要),否则只需执行以下操作:

    • 忽略到 robots.txt 的路由

      routes.IgnoreRoute("robots.txt");

    • 将 robots.txt 文件添加到您的根目录

    【讨论】:

    • 实际上默认情况下 IIS 无需任何配置即可执行此操作。 (除了 .aspx 'files' 之外,任何带有扩展名的 url 都被视为文件)
    • 我们实际上有一个用例:在开发站点上拒绝机器人(以防我们弄乱防火墙设置),但在生产中允许它(通过web.config 更改)。
    • 我还有一个用例。 3 个运行相同应用程序的 Umbraco 网站。我需要为每个域提供不同的 robots.txt 文件。
    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 2020-03-18
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多