Url IIS在queryString中将双斜杠修改为单斜杠
我的问题如下: 我有一段代码作为网关,将请求路由到一个或另一个后端服务器。这段代码实际上是在IHttpHandler中实现的,IHttpHandler是在404上触发的 伪代码如下:Url IIS在queryString中将双斜杠修改为单斜杠,url,iis-7,http-status-code-404,httphandler,Url,Iis 7,Http Status Code 404,Httphandler,我的问题如下: 我有一段代码作为网关,将请求路由到一个或另一个后端服务器。这段代码实际上是在IHttpHandler中实现的,IHttpHandler是在404上触发的 伪代码如下: public void ProcessRequest(HttpContext context) { try { var absoluteUri = context.Request.Url.AbsoluteUri; //
public void ProcessRequest(HttpContext context)
{
try
{
var absoluteUri = context.Request.Url.AbsoluteUri;
//... clean URL to get the part that we need
string RedirectTo = ...;
context.Response.Redirect(RedirectTo, false);
}
catch (Exception ex)
{
...
}
}
我的问题是,在到达该代码的查询字符串中,有一些参数被加密(和编码)。
不幸的是,对值的加密方式没有太多的控制,一些加密的值包含连续的正斜杠。
例如:网站/12345?参数=o//go4lia0%3d
当IIS收到请求时,双斜杠最初被编码(%3d%3d)
从逻辑上讲,IIS找不到相应的文档(这是预期的),并调用上面的处理程序。问题是在这个阶段,查询字符串已经被IIS解码,并且两个连续的斜杠转换为一个。这将导致解密查询字符串失败
有没有办法告诉IIS:请不要使用双斜杠
很少澄清:
-此功能是生成发送给最终用户的链接,以便自动填充屏幕上的某些字段。我知道在MVC控制器中处理这个问题会更容易。。。也许我最终会这么做,而不是触发404
- 生成加密值的代码可以更改,这样就不会生成斜杠(这在一开始是个好主意,但是已经有发送了不正确链接的电子邮件,所以太晚了
谢谢您解决了这个问题吗?我不知道您是否可以告诉IIS不要使用双斜杠,但您可以通过访问此服务器变量来解析原始未触及的URL以获取未修改的查询字符串值:
HttpContext.Current.Request.ServerVariables["UNENCODED_URL"]
我试过了,虽然双斜杠在HttpContext.Current.Request.RawUrl中消失了,但它们仍然存在于HttpContext.Current.Request.ServerVariables[“UNENCODED_URL”].不,不幸的是,这个值给了我与RawUrl或AbsoluteUri类似的结果…非常感谢,我想我会尝试所有服务器变量,尽管我非常确信是IIS在URL到达HttpHandler之前删除了双斜杠。实际上,我想我知道怎么了…双斜杠不在查询字符串中首先,这就是为什么IIS放弃了它,我应该早就注意到了。如果它不在查询字符串中,我不确定是否有解决方案。我有一个与您类似的问题,所以我使用了如上所述的UNENCODED_URL server变量,解决了这个问题。但是,出现这种情况的链接是通过电子邮件发送的,并且使用Outlook作为邮件客户端仍然存在问题,因为Outlook会清理电子邮件中的URL,并去除双斜杠。实际上它做得有点太多了。我仔细检查了一下,但它不在查询字符串中。使用IIS 7日志,我发现当查询命中IIS时(甚至在触发404之前),双斜杠消失了。查询字符串不会出现这种情况。我想这是没有希望的,因为它可能是IIS和客户端之间的任何内容,所以。。。