5

我必须关注网址:

http://example.org/sessionstuff/kees/view.aspx?contentid=4&itemid=5

它需要重写,因此它将转到:

http://example.org/sessionstuff/view.aspx?site=kees&contentid=4&itemid=5

基本上它会kees取值并将其作为site参数。我正在使用在我的 web.config 中使用规则的 IIS URL 重写模块。我已将以下代码添加到我的 web.config:

<rule name="RedirectSite" stopProcessing="true">
    <match url="^(\D[^/]*)/(.*)$" />
    <action type="Rewrite" url="{R:2}?site={R:1}" />
</rule>

一切正常,但是当我进行回发时,site参数加倍。我已经通过在我的 .aspx 页面上使用以下代码对此进行了测试:

<h3>Querystring</h3>
<ul>
    <% foreach (string key in Request.QueryString.Keys)
        Response.Write(String.Format("<li><label>{0}:</label>{1}</li>", key, Request.QueryString[key])); %>
</ul>
<asp:Button runat="server" Text="Postback" />

第一次

Querystring
site: kees
contentid: 4
itemid: 5

第二次

Querystring
site: kees, kees <--- double
contentid: 4
itemid: 5

如何防止site参数自我复制?每个回发都会增加另一个值。

注意:其他查询参数必须存在,因此使用appendQueryString="false"似乎不是一个选项。

4

1 回答 1

2

site=如果 URL 已经包含参数(无论它位于查询字符串中的哪个位置),看起来这可以通过不重写 URL 来解决。那么我们该怎么做呢?

在这里查看第 9 条:http ://ruslany.net/2009/04/10-url-rewriting-tips-and-tricks/

我现在没有办法对此进行测试,但我认为这样的事情应该可以工作:

<rule name="Query String Rewrite">
  <match url="^(\D[^/]*)/(.*)$" />
  <conditions>
    <add input="{QUERY_STRING}" pattern="^((?!site=).)*$" />
  </conditions>
  <action type="Rewrite" url="{R:2}?site={R:1}" />
</rule>

注意:我不擅长规则重写,但是^((?!site=).)*$当字符串不包含时,此正则表达式匹配site=,这是您希望重写规则运行的时候,因此我将其添加为条件。我认为你可以更有效地做到这一点。

我在这里要做的是说:让我们重写规则,但前提是它尚未包含site参数。

我希望这足以让你回答这个问题!

===

这似乎有效:

<rule name="RedirectSite" stopProcessing="true">
    <match url="^(\D[^/]*)/(.*)$" />
    <conditions>
        <add input="{QUERY_STRING}" pattern="^((?!site=).)*$" />
    </conditions>
    <action type="Rewrite" url="{R:2}?site={R:1}" />
</rule>


<rule name="RedirectSite2" stopProcessing="true">
    <match url="^(\D[^/]*)/(.*)$" />
    <conditions>
        <add input="{QUERY_STRING}" pattern="site=" />
    </conditions>
    <action type="Rewrite" url="{R:2}"  />
</rule>
于 2012-08-21T11:19:11.093 回答