带有加号的c#URL未通过自定义HttpModule运行

时间:2013-08-27 16:06:46

标签: c# asp.net asp.net-mvc httpmodule

我有一个自定义的HttpModule来重定向来自网站的旧版本的旧版URL,该版本会根据重定向的数据库表检查传入的请求URL。

但是,当传入请求URL包含加号(+)时,请求不会通过HttpModule传递 - 它可以按标准URL的预期工作。

例如,这些网址有效:

http://www.example.com/sample-url
http://www.example.com/sample url
http://www.example.com/sample%20url

这些不是:

http://www.example.com/sample+url
http://www.example.com/sample%2Burl

这是我的模块声明:

<add name="LegacyUrlHttpModule" type="Web.LegacyUrlHttpModule, Framework.Web" preCondition="managedHandler" />

我错过了这里的设置还是什么?

3 个答案:

答案 0 :(得分:3)

Scott Hanselmann写了一篇nice blog post,解释了如何在网址的Path部分启用所有类型的垃圾符号。

他的结论如下:

  

在完成所有这些努力以获得请求路径中的疯狂内容之后,就是这样   值得一提的是,只需将值保留为Query的一部分   字符串(记得在这篇文章的开头回答?)更容易,   更清洁,更灵活,更安全。

所以基本上如果你在url中有这样的字符,那些字符应该作为查询字符串参数传递,而不是试图在Path部分中传递它们。

答案 1 :(得分:3)

默认情况下,IIS会拒绝网址中的+。解决方法是allowDoubleEscaping

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

但请注意,这可能会使您的网站更容易受到恶意网址的攻击。<​​/ p>

答案 2 :(得分:0)

您可以按照以下步骤操作:

  1. 在“ IIS Web服务器”部分中,双击“请求过滤”图标
  2. 在“文件扩展名”中,右键单击->“编辑功能设置...”,将文件“ web.config”
  3. 选中“允许双重转义”选项(默认情况下未选中此选项)
  4. 对“默认网站”(或您为网站指定的名称)重复上述所有3个步骤
  5. 重新启动IIS