10

我在 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>
4

3 回答 3

14

我能够通过添加来解决这个问题

Form.Action = Request.RawUrl;

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

于 2010-08-30T20:34:42.737 回答
11

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

希望这可以帮助。

于 2009-07-27T07:06:08.500 回答
0

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

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

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

于 2009-08-16T21:06:29.887 回答