代码之家  ›  专栏  ›  技术社区  ›  bopapa_1979

MVC参数中的加号(+)导致IIS 7.0上的404

  •  29
  • bopapa_1979  · 技术社区  · 14 年前

    我有一个MVC路由,让我在一个运行IIS的临时服务器上下地狱。我正在本地运行VisualStudio2010的开发服务器。

    下面是一个在“我的开发”框中实际运行的示例URL:

    Root/CPUBoards/Full+Size
    
    Results
    Server Error404 - File or directory not found.
    The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable.
    

    这是我看到的完整的行为。

    本地主机:

    Root/CPUBoards/Full Size - Resolves
    Root/CPUBoards/Full%20Size - Resolves
    Root/CPUBoards/Full+Size - Resolves
    

    使用IIS 7.0的暂存服务器:

    Root/CPUBoards/Full Size - Resolves
    Root/CPUBoards/Full%20Size - Resolves
    Root/CPUBoards/Full+Size - 404 Not Found Error.
    

    UrlEncode(“全尺寸”)返回带有加号的版本。。。全尺寸。这在我的dev box上有效,但在staging服务器上无效。我更愿意让它在服务器上运行,因为我已经在本地测试和运行了其他所有东西,但是我不知道从哪里开始查看服务器配置,让它以同样的方式运行。

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  20
  •   bobince    14 年前

    + 只有作为一个空间的特殊意义 application/x-www-form-urlencoded

    在URL的其他部分,比如路径组件, + 字面意思是加号。所以解决 Full+Size 到未编码的名称 Full Size 不应该在任何地方工作。

    路径组件中空间的唯一正确形式是 %20 . (当您键入实际空格时,它仍然有效,因为浏览器会发现错误并为您更正。) %20 也适用于表单URL编码的数据,所以通常使用它是最安全的。

    HttpUtility.UrlEncode 名字有误导性。它产生 在它的输出中而不是 %20 %20 在编码之后。

    或者,避免在路径零件中使用空格,例如用 - . 通常会将标题插入到URL中,将其简化为简单的字母数字和安全的标点符号,以避免在URL中填充难看的内容 %nn

        2
  •  21
  •   splattne    14 年前

    这是IIS安全设置。有一个标准的请求过滤器,它拒绝包含+(加号)字符的URL。

    <configuration>
       ...
       <system.webServer>
          ...
          <security>
              <requestFiltering allowDoubleEscaping="true" />
          </security>
        </system.webServer>
        ...
    </configuration>
    
        3
  •  4
  •   kendaleiv    12 年前

    System.Web.HttpUtility.UrlPathEncode(string str) 编码 + %20

        4
  •  0
  •   Feras    4 年前

    遗憾的是,HttpUtility.UrlEncode的名称有误。它在输出中生成+而不是%20,因此它实际上是一个表单URL编码器,而不是一个标准URL编码器。不幸的是,我不知道有什么ASP.NET函数可以真正对路径中使用的字符串进行URL编码,所以我只能建议在编码后将字符串替换为+到%20。