错误的 returnURL 与 Helicon isapi 重写 + asp.net LoginStatus

Wrong returnURL with Helicon isapi re-write + asp.net LoginStatus

我们的网站出现了一些奇怪的问题。

我们在IIS 6.0上使用helicon isapi rewrite,实际的网址重写效果很好。但... 当我尝试通过 asp.net LoginStatus 控件登录时,它会重定向到带有 'returnURL' 查询字符串参数的 login.aspx 页面:

/account/login.aspx?ReturnUrl=%2fwindfarms%2fbarrow-united-kingdom-uk01.html

然而,由于某些奇怪的原因,它将原始的 none-重写的查询字符串参数添加到它的 returnURL 参数中,如下所示:

/account/login.aspx?ReturnUrl=%2fwindfarms%2fbarrow-united-kingdom-uk01.html %3fwindfarmID%3duk01

澄清一下,在“.htaccess”文件中,我们有:

RewriteRule [\w\W\s\S-]*-(\w\w\d[\d\w]+)\.html windfarms.aspx?windfarmID= [QSA]

我们重写的网址将如下所示:

barrow-united-kingdom-uk01.html

但是当点击 asp.net LoginStatus 控件时,它看起来像:

/account/login.aspx?ReturnUrl=%2fwindfarms%2fbarrow-united-kingdom-uk01.html%3fwindfarmID%3duk01

登录成功后是这样的:

/barrow-united-kingdom-uk01.html?windfarmID=uk01

为什么会发生这种情况,我该如何预防?

谢谢大家

更新

我发现实际的表单操作方法在点击 asp.net LoginStatus 控件之前已经改变,所以 html 在按下 'Login' 按钮之前看起来像这样:

<form name="aspnetForm" method="post" action="barrow-united-kingdom-uk01.html?windfarmID=uk01" id="aspnetForm">

"ReturnUrl" 参数从您的 ASP 代码返回(即使它是自动完成的)并且当 ASP.NET 开始运行时 URL 已经被重写为它的查询字符串形式(毕竟这是 URL 重写的目的)。因此,当服务器端 ASP 代码将登录重定向发送回客户端时,它使用 URL 的重写(查询字符串)形式。不幸的是,除了重载登录操作和在服务器端嵌入一些逻辑以在将 URL 发送到客户端之前将它们转换回它们的友好形式之外,没有解决此问题的简单方法。

或者您可以在您之前编写规则以将查询字符串形式重定向回重写的形式。这将使用户看起来整洁,SEO 友好性在这里并不重要,因为 google 爬虫不太可能登录到您的网站。请在您的规则前添加:

RewriteCond %{QUERY_STRING} (.*)windfarmID=[^&]+(.*) [NC]
RewriteRule ([\w\s]*-\w\w\d[\d\w]+\.html) ?%1%2 [NC,R]