我几天来一直在解决这个问题,似乎无法弄清楚是什么导致了这个问题。
我有一个需要激活的注册系统。使用散列将电子邮件发送给用户,当用户单击激活链接时,该散列将传递回服务器。很基本的东西。链接看起来像这样:
http://site/activate.aspx?activationKey=26a51d9eba86c73b8f7e800c41bf55453ed3b1c4
在我的本地机器上运行(运行VS2010)时,这可以完美运行。但是,当站点被推送到实时服务器(IIS 6)时,查询字符串正在被破坏,可能是由IIS。一旦查询字符串到达代码隐藏后,任何出现的“80”都被剥离,导致激活失败。
我想知道这是否是编码/解码问题,但没有一个字符是特殊的,所以我认为不应该是这种情况。
答案 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”的查询字符串,我不会这样做。
感谢至少指出我正确的方向,伙计。