0

我的网站有点奇怪。

我们在IIS 6.0上使用helicon isapi rewrite,实际的网址重写工作正常。但是...当我尝试通过 asp.net LoginStatus 控件登录时,它会使用“returnURL”查询字符串参数重定向到 login.aspx 页面:

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

但是由于某些奇怪的原因,它将原始未重写的查询字符串参数添加到它的 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=$1 [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 看起来像这样:

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

1 回答 1

1

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

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

RewriteCond %{QUERY_STRING} (.*)windfarmID=[^&]+(.*) [NC]
RewriteRule ([\w\s]*-\w\w\d[\d\w]+\.html) $1?%1%2 [NC,R]
于 2016-10-26T12:17:58.967 回答