损坏的查询字符串:IIS正在删除“80”?

时间:2012-01-05 05:24:53

标签: c# asp.net iis-6

我几天来一直在解决这个问题,似乎无法弄清楚是什么导致了这个问题。

我有一个需要激活的注册系统。使用散列将电子邮件发送给用户,当用户单击激活链接时,该散列将传递回服务器。很基本的东西。链接看起来像这样:

http://site/activate.aspx?activationKey=26a51d9eba86c73b8f7e800c41bf55453ed3b1c4

在我的本地机器上运行(运行VS2010)时,这可以完美运行。但是,当站点被推送到实时服务器(IIS 6)时,查询字符串正在被破坏,可能是由IIS。一旦查询字符串到达​​代码隐藏后,任何出现的“80”都被剥离,导致激活失败。

我想知道这是否是编码/解码问题,但没有一个字符是特殊的,所以我认为不应该是这种情况。

3 个答案:

答案 0 :(得分:2)

我知道IIS默认情况下不会从查询字符串中删除80。我在我的网站上多次使用查询字符串,没有任何问题。

通过IIS查看url-rewrite规则。我不确定IIS-log是否会在IIS之前使用最终的url或url。但考虑到它是80,我想有人想从网址中删除端口80,但为此添加了错误的重写规则。

所以我会找一个有人试图从网址中删除端口80的地方。可以在IIS或上游。

答案 1 :(得分:1)

在网站上启用trace.axd并检查发送的值是什么。您确定电子邮件客户端没有做任何事吗

答案 2 :(得分:1)

好吧,我发现了问题。 @pst和@Mikael Eliasson是对的,从某种意义上说,有些goon确实有一些重写规则。

通过将403; 4错误重定向到另一个(预先存在的)应用程序来强制进入SSL,该应用程序重写URL以使用HTTPS。从某种意义上说,您可以在应用程序上强制使用SSL,其余的则是(破碎)魔法。这是原始代码:

if ( Request.ServerVariables[ "SERVER_PORT" ] == "80" ) {
    try {
        string queryString, secureURL;

        queryString = Request.Url.AbsoluteUri.ToString();
        queryString = Request.ServerVariables[ "QUERY_STRING" ];
        Response.Write( queryString + "<br>" );

        secureURL = queryString.Replace( "http", "https" );
        secureURL = secureURL.Replace( "403;", "" );
        secureURL = secureURL.Replace( "80", "" );

        Response.Write( secureURL );
        Response.Redirect( secureURL );
    }
    catch ( Exception ex ) {
    }
}

注意那里残酷地替换“80”。将该替换更改为“:80”可以解决问题,假设我没有传递带有“:80”的查询字符串,我不会这样做。

感谢至少指出我正确的方向,伙计。