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

问题描述 投票:29回答:4

我有一条MVC路由,使我在运行IIS的登台服务器上陷入困境。我正在本地运行Visual Studio 2010的开发服务器。

这里是一个示例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.

有什么想法吗?由于多种原因,我需要使用编码版本...不会浪费您的时间。

HttpUtility.UrlEncode(“ Full Size”)返回带有加号的版本... Full + Size。这适用于我的开发盒,但不适用于登台服务器。我宁愿只让它在服务器上运行,因为我已经进行了所有其他测试并在本地工作,但是我不知道从哪里开始寻找服务器配置以使其表现相同。

谢谢!

asp.net-mvc-2 arguments asp.net-mvc-routing
4个回答
20
投票

[+仅具有作为application/x-www-form-urlencoded数据中的空格(例如URL的查询字符串部分)的特殊含义。

在URL的其他部分(如路径组件)中,+字面意思是加号。因此,将Full+Size解析为未编码的名称Full Size不应在任何地方使用。

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

Sadly HttpUtility.UrlEncode被误导。它在输出中产生+而不是%20,因此它实际上是一个形式URL编码器,而不是标准URL编码器。不幸的是,我不知道一个ASP.NET函数来“真正地URL编码”在路径中使用的字符串,因此我所建议的是在编码后将+替换为%20

或者,避免在路径部分中使用空格,例如通过将其替换为-。为避免在URL中插入难看的%nn序列,通常会将“ slug”标题插入URL,将其简化为简单的字母数字和“安全”标点。

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

您可以为您的网站禁用它,将其添加到您的web.config:

<configuration>
   ...
   <system.webServer>
      ...
      <security>
          <requestFiltering allowDoubleEscaping="true" />
      </security>
    </system.webServer>
    ...
</configuration>

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

完全同意@bobince,问题在于对%2b而不是%20b的编码错误

Sadly HttpUtility.UrlEncode的名称具有误导性。它在输出中产生+而不是%20,因此它实际上是一个表单URL编码器,而不是标准的URL编码器。不幸的是,我不知道一个ASP.NET函数来“真正地URL编码”在路径中使用的字符串,因此我所建议的是在编码后将字符串替换为+到%20。

这是重要的部分,用%20替换+号


20
投票

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


4
投票

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


0
投票

完全同意@bobince,问题在于对%2b而不是%20b的编码错误

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.