带有 URL 重写模块的 IIS 7.5 在回发时将 QueryString 参数加倍

Posted

技术标签:

【中文标题】带有 URL 重写模块的 IIS 7.5 在回发时将 QueryString 参数加倍【英文标题】:IIS 7.5 with URL Rewrite Module Doubles QueryString Params on Postback 【发布时间】:2010-11-09 15:47:00 【问题描述】:

我在 Windows 7 RC 上使用 IIS 7.5。我使用 IIS Url Rewrite 模块来重写 URL。

一切似乎都很好,直到我通过单击按钮执行回发。然后它将查询字符串参数附加到我重写的 URL 中,如下所示:

重写的 URL,就像它在浏览器中显示的那样: http://localhost/en/product/1239/Gary+Fisher+Hkek+Mountain+Bike

没有 URL 重写的 URL 是:

http://localhost/product.aspx?lang=en&id=1239&title=Gary+Fisher+Hkek+Mountain+Bike

当我单击按钮执行回发时,URL 变为:

http://localhost/en/product/1239/Gary+Fisher+Hkek+Mountain+Bike?lang=en&id=1239&title=Gary+Fisher+Hkek+Mountain+Bike

当 URL 被重写时,所有查询字符串参数都加倍 - 所以当我想通过这样做来获取当前语言时:

Request.QueryString["lang"]

我得到的值是“en,en”。

还有其他人有这些问题吗?

更新:从 Web.Config 重写规则

<rule name="RedirectProductPageUrls" stopProcessing="true">
    <match url="^product\.aspx$" />
    <conditions logicalGrouping="MatchAll">
        <add input="REQUEST_METHOD" negate="true" pattern="^POST$" />
        <add input="QUERY_STRING" pattern="^lang=([^=&amp;]+)&amp;id=([^=&amp;]+)&amp;title=([^=&amp;]+)$" />
    </conditions>
    <action type="Redirect" url="C:1/products/C:2/C:3" appendQueryString="false" redirectType="Permanent" />
</rule>
<rule name="RewriteProductPageUrls" stopProcessing="true">
    <match url="^([^/]+)/product/([^/]+)/([^/]+)/?$" />
    <conditions logicalGrouping="MatchAll">
        <add input="REQUEST_FILENAME" matchType="IsFile" negate="true" />
        <add input="REQUEST_FILENAME" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="product.aspx?lang=R:1&amp;id=R:2&amp;title=R:3" />
</rule>

【问题讨论】:

你能发布你的重写规则吗?只需发布 web.config 中的任何内容:... 更新了重写规则和产品页面的重定向规则。 【参考方案1】:

我可以通过添加来解决问题

Form.Action = Request.RawUrl;

到 Page_Load 事件。我能够离开 appendQueryString="TRUE" 并且到目前为止它工作正常。

【讨论】:

嘿,Ryan,我在 appendQueryString 上摆弄了一个小时,但没有成功。但是你的建议奏效了!谢谢 是的,这个问题其实是通过修改表单动作来解决的。您可以创建自定义控件适配器,以便将更改应用于站点中的所有表单。 Scott Gu 在这篇文章的底部有一个指南:link【参考方案2】:

将 appendQueryString="false" 属性也添加到重写规则的 action 元素中。

希望这会有所帮助。

【讨论】:

【参考方案3】:

这是 IIS 重写模块的一项安全功能。

我个人更喜欢 ISAPI Rewrite,因为它更好,编写规则更简单,功能更多。

还发现在中高负载(超过 100 个网站连接)下,IIS 重写模块会处理应用程序池崩溃和生成新进程。

【讨论】:

Bruce,我刚刚放弃了 UrlRewritting Dll,因为它迫使我在经典模式下使用 app_pool。我认为 IIS 7 的内置会更好,更优化。您是否建议其他方式?请让我知道..我很担心。

以上是关于带有 URL 重写模块的 IIS 7.5 在回发时将 QueryString 参数加倍的主要内容,如果未能解决你的问题,请参考以下文章

Gridview 中 TemplateField 中的复选框在回发时丢失

jQuery填充的Gridview在回发时丢失数据

在回发时,如何向验证摘要添加错误消息?

asp.net sessionID 在回发时更改?

asp .net背景图像在回发时闪烁

DropDownList 中的 ListItems 属性在回发时丢失?