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=([^=&]+)&Series=([^=&]+)$" />
</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}}&Series={URLEncode:{R:3}}" />
</rule>
</rules>
</rewrite>
所以,据我所知,这个问题的答案是——
像我描述的那样设置散列对于一个是不可能的,但是对于两个,我可以将 ^Type=([^=&]+)&Series=([^=&]+)&(.+)
重定向到不同的 URL、{R:1}/product-details/{C:1}/{C:2}?{C:3}#search
。 AppendQueryString 在这里是假的,因为我已经用 &(.+)
=> ?{C:3}
捕获了其他查询字符串
不过,我也找到了另一种解决方案,即只使用 Javascript/JQuery 动画,在 JavaScript 中检测适当的情况(在这种情况下,检查其他查询字符串),然后让 JS 滚动到正确的锚点。这完全避免了使用 IIS 重写,并使用最少的 javascript.
我有一套两个 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=([^=&]+)&Series=([^=&]+)$" />
</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}}&Series={URLEncode:{R:3}}" />
</rule>
</rules>
</rewrite>
所以,据我所知,这个问题的答案是——
像我描述的那样设置散列对于一个是不可能的,但是对于两个,我可以将 ^Type=([^=&]+)&Series=([^=&]+)&(.+)
重定向到不同的 URL、{R:1}/product-details/{C:1}/{C:2}?{C:3}#search
。 AppendQueryString 在这里是假的,因为我已经用 &(.+)
=> ?{C:3}
不过,我也找到了另一种解决方案,即只使用 Javascript/JQuery 动画,在 JavaScript 中检测适当的情况(在这种情况下,检查其他查询字符串),然后让 JS 滚动到正确的锚点。这完全避免了使用 IIS 重写,并使用最少的 javascript.