这是IIS安全设置。有一个标准的请求过滤器,它拒绝包含+(加号)字符的URL。
我有一条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。这适用于我的开发盒,但不适用于登台服务器。我宁愿只让它在服务器上运行,因为我已经进行了所有其他测试并在本地工作,但是我不知道从哪里开始寻找服务器配置以使其表现相同。
谢谢!
[+
仅具有作为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替换+号
这是IIS安全设置。有一个标准的请求过滤器,它拒绝包含+(加号)字符的URL。
[System.Web.HttpUtility.UrlPathEncode(string str)
将+
编码为%20
完全同意@bobince,问题在于对%2b而不是%20b的编码错误