IIS URL 重写,URL 中的条件更改

IIS URL Rewrite, Conditional change in URL

我有一套两个 IIS URL 重写规则,基于 "UserFriendlyURL" 自动规则。这两条规则的要点是采用前两个查询字符串参数(Type 和 Series)并将它们转换为用户友好的 URL。 如果用户与该页面上的搜索进行交互,此页面可能会将您带回此页面,但带有其他查询字符串参数,例如 "page" 或 "pageSize".

我希望那些 non-type/series 参数保留为查询字符串参数,因为它们不是友好 URL 的一部分,但如果这些项目存在,我希望页面向下滚动到Search 对象(因为很明显,用户只是与它进行了交互)。

为此,我想我想做的是在末尾添加一个位置哈希 (#search)。而不是遍历该页面上的每个搜索词并手动将“#search”添加到末尾(其中许多实际上是点击操作,我不想编辑每个 JS 方法以将其添加到生成的 URLs),如果只捕获任何查询字符串参数(type/series 除外)存在的事实,那将是很好的,如果存在,则将“#search”添加到 [=29= 的末尾].

这可行吗?如果可行,怎么做?我知道正则表达式中的条件: http://www.regular-expressions.info/conditional.html

但我认为这些在这种情况下行不通(我很乐意错了!)

<rewrite>
  <rules>
    <rule name="RedirectUserFriendlyURL1" stopProcessing="true">
      <match url="^(cn/)?/product-details$" />
      <conditions>
        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
        <add input="{QUERY_STRING}" pattern="^Type=([^=&amp;]+)&amp;Series=([^=&amp;]+)$" />
      </conditions>
      <action type="Redirect" url="{R:1}/product-details/{C:1}/{C:2}" appendQueryString="false" />
    </rule>
    <rule name="RewriteUserFriendlyURL1" stopProcessing="true">
      <match url="^(cn/)?/product-details/([^/]+)/([^/]+)$" />
      <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
      </conditions>
      <action type="Rewrite" url="{R:1}/product-details?Type={URLEncode:{R:2}}&amp;Series={URLEncode:{R:3}}" />
    </rule>
  </rules>
</rewrite>

所以,据我所知,这个问题的答案是—— 像我描述的那样设置散列对于一个是不可能的,但是对于两个,我可以将 ^Type=([^=&amp;]+)&amp;Series=([^=&amp;]+)&amp;(.+) 重定向到不同的 URL、{R:1}/product-details/{C:1}/{C:2}?{C:3}#search。 AppendQueryString 在这里是假的,因为我已经用 &amp;(.+) => ?{C:3}

捕获了其他查询字符串

不过,我也找到了另一种解决方案,即只使用 Javascript/JQuery 动画,在 JavaScript 中检测适当的情况(在这种情况下,检查其他查询字符串),然后让 JS 滚动到正确的锚点。这完全避免了使用 IIS 重写,并使用最少的 javascript.