【问题标题】:IIS hosting ASP.NET MVC site gives http 404 for urls containing 'web.config'IIS 托管 ASP.NET MVC 站点为包含“web.config”的 url 提供 http 404
【发布时间】:2013-01-17 00:55:36
【问题描述】:

使用包含 web.config 的 url 从 IIS(托管 ASP.NET MVC 3 站点)请求页面会产生 404 错误。带有 app.config 的 URL 没有问题。本地 Visual Studio 开发服务器对此类 url 没有任何问题。

1 - 除了 web.config 之外,还有哪些其他特殊字词由 IIS 以这种方式处理? 在请求过滤页面/隐藏段选项卡中,这是当前状态:

我猜这些不是特殊词,因为 IIS 可以毫无问题地处理 bin、App_code 等词。

答案: 我猜这些是 IIS 以这种方式处理的词。所以这些是我认为的默认单词,这个列表是可配置的(可以将新项目添加到这个列表中)。

2 - 是否有任何快速修复(例如通过 web.config 修改)来处理带有这些特殊单词的 url?

顺便说一句,我不想​​提供 web.config 文件。网址格式为:www.mysite.com/es/web.config/1

【问题讨论】:

  • 您是否尝试提供 web.config 文件?如果是这样,你明白为什么这是一件非常危险的事情吗?
  • 不,我正在尝试提供 web.config 文件。它只是一个动作的参数。所以它包含在url中。
  • 问: “您是否尝试提供 web.config 文件?” A: “不,我正在尝试提供 web.config 文件。”哦,我现在明白了。
  • 好吧....你有没有考虑过改变你的url以免引起各种奇怪的框架问题?也许只是放弃.
  • @asawyer 我认为这是要走的路。但我要问的是(第一个问题)还有哪些其他词可能会导致各种奇怪的框架问题。

标签: asp.net-mvc asp.net-mvc-3 iis web-config http-status-code-404


【解决方案1】:

这是Request Filtering 部分下的 IIS 配置的一部分:

您可以添加/删除过滤器。
但是,我确实认为从中删除web.config 是一个非常坏主意

http://www.iis.net/configreference/system.webserver/security/requestfiltering

【讨论】:

    【解决方案2】:

    原因:

    正如您已经展示了 IIS 配置的快照。这些是 .Net 应用程序中保留的文件夹和文件,因此 IIS 希望保留这些以确保安全。

    包含这些字符串的 URL 仅当这些字符串出现在 ? 之前并且恰好在两个斜杠 /../ 或最后出现时才返回为 404 响应。例如:www.example.com/bin/anything.extwww.example.com/folder/sub/web.config

    IIS 可以在任何地方匹配这些字符串,因为 web.config 我们可以在任何目录级别。

    如果这些字符串有任何内容,那么页面将由 IIS 提供。例如:www.example.com/bin-folder/anthing.extwww.example.com/sub/bin.htmlwww.example.com /-web.confing/page.aspx 没问题。


    我建议在这些字符串中使用其他词,或者在带有扩展名的 URL 末尾使用,这样它就不会出现在两个斜杠之间。

    例如:www.example.com/en-web.config/1www.example.com/en/1/web.config.aspx



    即使这样我也有一个棘手的解决方案:

    如果您确实需要这些字符串,而 URL 中没有其他字词,那么我推荐 use URL-ReWrite.。这可能整体上并不快,但除了第 2 步,它快速方便,因为第 2 步取决于您的应用程序。

    1- 在 IIS 的顶层添加此规则:

    正则表达式匹配:(/web|^web)\.(config$|config/) //OR as your requirement

    重新写入:handler.aspx?url={REQUEST_URI}

    <rule name="web-config" stopProcessing="true">
      <match url="(/web|^web)\.(config$|config/)" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
      <action type="Rewrite" url="handler.aspx?url={REQUEST_URI}" appendQueryString="false" />
    </rule>
    

    2-handler.aspx(或任何其他语言页面)中检查url GET 变量并做出相应响应。Request.QueryString("url")

    • 请谨慎操作,因为您在这里控制安全。
    • 我建议只在handler.aspx or handler.php 中包含要响应的实际页面内容,而不是重定向等。
    • 在包含内容之前首先验证 URL(通过正则表达式等),并包含硬编码的内容,不要将 URL 的任何部分放入变量中,并在 response-inclusion-code 中使用该变量。

    3- 最后从 IIS 管理器中,在特定网站中转到请求过滤->隐藏段选项卡并删除所需字符串。例如:web.config。这一步也可以通过 web.config 来完成:

    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="209715200" />
        <hiddenSegments>
          <remove segment="web.config" />
        </hiddenSegments>
      </requestFiltering>
    </security>
    

    现在,IIS 将为页面提供服务,您的处理程序页面将在用户浏览器中显示具有完全相同 URL 的输出。

    【讨论】:

      猜你喜欢
      • 2019-11-24
      • 2013-07-23
      • 1970-01-01
      • 2011-06-21
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      相关资源
      最近更新 更多