MVC Argument中的加号(+)在IIS 7.0上导致404

时间:2010-07-30 22:20:34

标签: asp.net-mvc-2 arguments asp.net-mvc-routing

我有一条MVC路由让我在运行IIS的登台服务器上下地狱。我在本地运行Visual Studio 2010的开发服务器。

以下是我的开发箱实际可用的示例网址:

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。这适用于我的开发箱,但不适用于登台服务器。我更愿意让它在服务器上工作,因为我已经测试了所有其他工作并在本地工作,但我不知道从哪里开始查看服务器配置以使其行为方式相同。

谢谢!

4 个答案:

答案 0 :(得分:20)

+仅具有application/x-www-form-urlencoded数据中空格的特殊含义,例如网址的查询字符串部分。

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

路径组件中唯一正确的空格形式是%20。 (当您键入实际空间时,它仍然有效,因为浏览器会发现错误并为您纠正错误。)%20也适用于表单URL编码数据,因此始终最安全地使用它。 / p> 遗憾的是HttpUtility.UrlEncode被误导了。它在输出中产生+而不是%20,因此它实际上是一个表单URL编码器而不是标准的URL编码器。不幸的是我不知道一个ASP.NET函数来“真正地对URL编码”字符串以便在路径中使用,所以我建议我在编码后将+字符串替换为%20

或者,避免在路径部分中使用空格,例如。用-替换它们。将'slug'标题插入到URL中是很常见的,将它们简化为简单的字母数字和“安全”标点,以避免用丑陋的%nn序列填充URL。

答案 1 :(得分:20)

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

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:0)

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

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

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