在IIS中使用Url Rewrite手动附加查询字符串

时间:2013-07-28 22:24:54

标签: c# asp.net iis url-rewriting query-string

我正在尝试创建重写规则,例如:

~/company_search.aspx?cat=987&page=2&loc=1234

~/company_category/987/estiatoria/?loc=1234&page=2

我的重写规则是:

<rule name="Company Category">
<match url="company_category/([0-9]+)/(?:[^/]*)/?" />
<action type="Rewrite" url="company_search.aspx?cat={R:1}" appendQueryString="true" />
</rule>

示例重写url中的part / estiatoria /对于seo优化是可选的,而在实际的查询字符串中没有指定,也没有任何其他用途。当我做回发时,我得到cat参数2次,值为987,987,我的服务器端代码搞砸了。

所以我尝试手动附加查询字符串以排除cat参数并附加所有其他参数。所以我把规则改为:

<rule name="Company Category">
<match url="company_category/([0-9]+)/(?:[^/]*)/?(?:\?|&amp;)?(.*)" />
<action type="Rewrite" url="company_search.aspx?cat={R:1}&amp;{R:2}" appendQueryString="false" />
</rule>

但除了cat之外,我在查询字符串中没有得到任何其他值。我做错了吗?

更新

我认为我必须添加一个查询字符串条件才能排除cat参数,然后追加其余的匹配结果。所以对于查询字符串:

?cat=987&page=2&loc=1234

我想得到:

?page=2&loc=1234

并且cat参数可以是任何顺序或不存在。

我试过了:

<rule name="Company Categories Search">
<match url="company_category/([0-9]+)/(?:[^/]*)/?" />
<conditions>
    <add input="{QUERY_STRING}" pattern="(?!cat=[0-9]+)(.*)(cat=[0-9]+|$)(?!cat=[0-9]+)(.*)" />
</conditions>
<action type="Rewrite" url="company_search.aspx?cat={R:1}&amp;{C:1}&amp;{C:3}" appendQueryString="false" />
</rule>

当我点击网址时:

~/company_category/987/estiatoria/?page=2&loc=1234

我在服务器端获取Request.Querystring以下值:

cat=987&page=2&loc=1234&

但是当我做回发时,我得到:

cat=987&at=987&page=2&loc=1234&

有人可以帮助我解决最后的正则表达式问题吗?

更新2:

我已经找到了解决方案,但并没有涵盖所有情况:

<rule name="Company Categories Search">
<match url="company_category/([0-9]+)/(?:[^/]*)/?" />
<conditions logicalGrouping="MatchAny">
    <add input="{QUERY_STRING}" pattern="(cat=[0-9]+)(.*)" />
    <add input="{QUERY_STRING}" pattern="(^)(.*)" />
</conditions>
<action type="Rewrite" url="company_search.aspx?cat={R:1}&amp;{C:2}" appendQueryString="false" />
</rule>

我使用了两个带有MatchAny选项的条件规则来匹配一个:当映射网址中存在cat值时的查询字符串(目前仅在回发中)和两个:当它不存在时。

如果cat参数以某种方式介于页面和loc参数之间,则前一个参数不包含在查询字符串中。如果有人有更好的解决方案,请告诉我。

0 个答案:

没有答案