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