C# IIS URL重写:在为多个文件提供服务时,如何可靠地保持相对路径?

C# IIS URL重写:在为多个文件提供服务时,如何可靠地保持相对路径?,c#,iis-7,url-rewriting,url-routing,asp.net,C#,Iis 7,Url Rewriting,Url Routing,Asp.net,我的WebApp是其中的一部分,当我向用户提供HTML页面时,它通常在a.href和img.src属性中包含相对路径 我目前通过URL访问它们,如:~/get data.aspx/实例/user/page.html——其中实例表示报表的特定实例,“user/page.html”是由生成内容的外部应用程序创建的路径 这对于应用程序的BeginRequest方法中的代码非常可靠,该方法将“.aspx”之后的文本转换为查询字符串,然后使用Context.RewritePath() 到目前为止还不错,但

我的WebApp是其中的一部分,当我向用户提供HTML页面时,它通常在a.hrefimg.src属性中包含相对路径

我目前通过URL访问它们,如:~/get data.aspx/实例/user/page.html——其中实例表示报表的特定实例,“user/page.html”是由生成内容的外部应用程序创建的路径

这对于应用程序的BeginRequest方法中的代码非常可靠,该方法将“.aspx”之后的文本转换为查询字符串,然后使用Context.RewritePath()

到目前为止还不错,但我刚刚被一件让我吃惊的事情绊倒了:如果任何查询字符串(“instance/user/page.html”)碰巧包含加号(“+”),则不会调用BeginRequest方法,并且会立即将404返回给用户

所以我的问题有两个:

  • 我认为“+”会导致404的说法正确吗?如果是的话,还有其他东西会导致类似的问题吗?有没有办法解决这个问题(可能是一种不同于BeginRequest的方法)

  • 有没有比我现在使用的更好的方法来为生成的内容保留相对URL路径?如果可以的话,我宁愿不要求站点管理员安装第三方重写工具


  • 是,这是一个IIS安全设置。你可以把它放在你的网页配置中

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

    然而,你可能必须小心你正在做的事情。启用双转义后,它将允许转义url本身包含转义字符,这些转义字符可用于利用您的url重写将转义字符传递到您的查询字符串中,以构造不同于您预期的查询字符串。

    谢谢,我现在可以接受此情况,但我不希望双转义,我真的希望它不被替换——我希望字符(+,等等)不被更改地通过。这会将它们转换为空间。我了解双转义字符(如%2526),但在我的情况下,我不担心漏洞利用。实际上,Request.RawUrl仍然有+字符,但%XX已解码(%2F变为斜杠等)