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

本文关键字:自定义 HttpModule 运行 URL | 更新日期: 2023-09-27 18:29:08

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

然而,当传入的请求URL包含加号(+)时,请求不会通过HttpModule——它可以正常工作于标准URL。

例如,这些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" />

我是不是错过了这里的布景?

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

Scott Hanselmann编写了一个nice blog post,解释了如何在url的Path部分启用各种垃圾符号。

他的结论如下:

经过这么多努力在请求路径中获得疯狂的东西值得一提的是,只需将值作为查询的一部分字符串(还记得这篇文章开头的吗?)更容易,更清洁、更灵活、更安全。

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

IIS默认拒绝URL中的+。解决方法是allowDoubleEscaping

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

但请注意,这可能会使您的网站更容易受到恶意URL的攻击。

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

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