我正在尝试创建一个重写规则,例如:
~/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]+)/(?:[^/]*)/?(?:\?|&)?(.*)" />
<action type="Rewrite" url="company_search.aspx?cat={R:1}&{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}&{C:1}&{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}&{C:2}" appendQueryString="false" />
</rule>
我使用了 2 个条件规则和 MatchAny 选项来匹配一个:当 cat 值出现在映射的 url 中时的查询字符串(目前仅在回发中)和两个:当它不存在时。
如果 cat 参数以某种方式介于 page 和 loc 参数之间,则前一个参数不包含在查询字符串中。如果有人有更好的解决方案,请告诉我。