Asp.net mvc 2 MVC参数中的加号(+;)在IIS 7.0上导致404
我有一个MVC路由,它让我在运行IIS的登台服务器上陷入困境。我正在本地运行VisualStudio2010的开发服务器 下面是一个示例URL,它实际上在我的开发设备上工作:Asp.net mvc 2 MVC参数中的加号(+;)在IIS 7.0上导致404,asp.net-mvc-2,arguments,asp.net-mvc-routing,Asp.net Mvc 2,Arguments,Asp.net Mvc Routing,我有一个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, o
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(“完整大小”)返回带有加号的版本。。。全尺寸。这适用于我的开发设备,但不适用于临时服务器。我更愿意让它在服务器上运行,因为我已经在本地测试并运行了所有其他内容,但我不知道从哪里开始查看服务器配置,以使其以相同的方式运行
谢谢
+
仅具有在应用程序/x-www-form-urlencoded
数据(如URL的查询字符串部分)中作为空格的特殊含义
在URL的其他部分,如路径组件中,+
字面意思是加号。因此,将Full+Size
解析为未编码的名称Full Size
在任何地方都不起作用
路径组件中唯一正确的空格形式是%20
。(当您键入实际空格时,它仍然有效,因为浏览器会发现错误并为您更正。)%20
也适用于格式URL编码的数据,因此通常最安全的方法是始终使用该格式
遗憾的是,HttpUtility.UrlEncode
的名称有误导性。它在输出中生成+
,而不是%20
,因此它实际上是一个表单URL编码器,而不是一个标准的URL编码器。不幸的是,我不知道ASP.NET函数可以在路径中使用“真正的URL编码”字符串,所以我只能建议在编码后将+
的字符串替换为%20
或者,避免在路径部分中使用空格,例如用
-
替换它们。通常会将“slug”标题插入URL,将其简化为简单的字母数字和“安全”标点符号,以避免用丑陋的%nn
序列填充URL。这是一种IIS安全设置。有一个标准的请求过滤器,它拒绝包含+(加号)字符的URL
您可以为您的web禁用它,并将其添加到您的web.config:
<configuration>
...
<system.webServer>
...
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
...
</configuration>
...
...
...
System.Web.HttpUtility.urlpathcode(string str)
将+
编码为%20
完全同意@bobince,问题在于对%2b而不是%20的编码错误
遗憾的是,HttpUtility.UrlEncode的名称有误导性。它在输出中生成+而不是%20,因此它实际上是一个表单URL编码器,而不是一个标准URL编码器。不幸的是,我不知道ASP.NET函数可以在路径中使用“真正的URL编码”字符串,所以我只能建议在编码后将字符串替换为+到%20
这是一个重要的部分,将+符号替换为%20是否可以使用IIS 7而不是ASP.NET开发环境在本地生成?确定。这很有帮助。这些URL“段”来自数据库,我们更希望数据库中的数据是自然的。我们还需要URL是唯一的,所以用“-”替换一堆内容是不可取的。例如,我们有下划线和空格字符,人们喜欢用破折号来代替它们。我想这意味着我们必须使用像%20这样的“丑陋”来准确地表示字符,但这些都是边缘情况,折衷也不是那么糟糕。我想我必须在URL编码之前做一些手动替换。谢谢不幸的是,您无法将任意字符串放入路径部分<代码>%2F(
/
的编码形式)在Apache中默认被许多web服务器阻止,在IIS中也不可避免地被阻止。IIS也会阻止%5C
,所有服务器都会阻止%00
(其他控制代码也会导致各种困难,当然路径部分中的Unicode也有自己的一些缺陷)。我认为OP已经找到了该部分-导致错误的原因更多是问题。对我来说是有效的。有关“allowDoubleEscaping”的更多详细信息,请参见: