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