MVC 5路由传入URL编码参数报404如何解决 是否需调整IIS设置
需求实现结论
该需求在MVC 5中完全可以实现,需配合少量IIS配置调整。出现404的核心原因是IIS默认会拦截路径中包含编码后冒号(%3A)、斜杠(%2F)等特殊字符的请求,防止路径遍历攻击,请求不会进入MVC路由处理环节。
具体实现步骤
1. 调整IIS配置(必填)
修改项目根目录的Web.config文件,添加如下配置:
- 关闭路径非法字符校验:在
system.web节点下添加httpRuntime配置,你可以选择仅移除不需要拦截的字符,或者完全关闭路径非法字符校验(前者安全性更高):
<!-- 方案1:仅移除冒号拦截,保留其余安全校验 --> <httpRuntime requestPathInvalidCharacters="<,>,*,%,&,\,?" requestValidationMode="2.0" /> <!-- 方案2:完全关闭路径非法字符校验,安全性较低,仅建议测试环境使用 --> <!-- <httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" /> -->
- 允许双重转义:在
system.webServer节点下添加请求过滤配置:
<security> <requestFiltering allowDoubleEscaping="true" /> </security>
2. 配置MVC通配符路由
默认路由规则只会捕获单个路径段的内容,你需要添加通配符路由来捕获info/后面的所有内容作为完整URL参数,在RouteConfig.cs的路由注册逻辑最上方添加如下规则:
routes.MapRoute( name: "InfoRedirectRoute", url: "info/{*targetUrl}", // *通配符表示捕获该位置后的所有路径内容作为参数 defaults: new { controller = "Home", action = "Info" } // 替换为你实际的控制器名 );
3. 编写Action处理逻辑
控制器中对应的Info方法示例如下:
public ActionResult Info(string targetUrl) { // 校验URL合法性,避免开放重定向漏洞 if (Uri.IsWellFormedUriString(targetUrl, UriKind.Absolute)) { return Redirect(targetUrl); } // 非法URL的兜底逻辑,可根据需求调整 return RedirectToAction("Index"); }
注意:为了提升安全性,建议额外添加跳转域名白名单校验,避免该接口被利用作为钓鱼跳转的中间节点
可选无需修改IIS的方案
如果你不想调整IIS的安全配置,可以修改参数传递方式,将URL放在查询字符串中传递,例如访问地址改为https://localhost:42901/info?url=http%3A%2F%2Fwww.google.com,这种方式不需要修改任何IIS配置,只需要Action直接接收url查询参数即可。
内容的提问来源于stack exchange,提问作者CodingQuestions
相关产品推荐
相关产品推荐

