1

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

~/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 中的 /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>

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

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

4

0 回答 0