IIS 使用可选查询字符串重写或添加默认值

IIS Rewrite with optional query string or adding defaults

我正在使用 IIS 8 并且只是在学习重写,因为我从来没有写过任何关心 SEO 的东西。

假设 url 如下所示,我有以下规则:/survey/abc123/email

<rule name="Survey Rule" stopProcessing="true">
    <match url="survey/([_0-9a-z-]+)/([_0-9a-z-]+)" />
    <action type="Rewrite" url="survey.htm?var1={R:1}&amp;var2={R:2}" />
</rule>

在 survey.htm 页面上,我有检查 var1 和 var2 是否存在的代码,但在这个重写中,如果我有 url /survey/abc123 它显然不会影响调查规则。我已经尝试了几个 <conditions> 但总能找到合适的。

感觉一定有办法说

If {R:1} exists then var1={R:1} else var1=''

If {R:2} exists then var2={R:2} else var1=''

最好是某种类型的 if 循环。有没有什么办法可以重写,无论调查后有多少 /,无论是 0 还是 10,它总是会出现在调查页面上?

我查看了重写映射,但我不确定是否能解决这个问题。

编辑

可能 url 我想重写:

/survey/abc123/
/survey.htm?var1=abc123
/survey/abc123/email/
/survey.htm?var1=abc123&var2=email
/survey/abc123/email/bob/
/survey.htm?var1=abc123&var2=email&var3=bob
/survey/abc123/email/bob/someOtherVar
/survey.htm?var1=abc123&var2=email&var3=bob&var4=someOtherVar

/result/1/
/result.htm?var1=1
/result/1/test@example.com
/result.htm?var1=1&var2=test@example.com

我希望斜杠后的第一个项目是页面名称,然后每个项目变成 "query_string"。我希望这更有意义。

简答

不能完全你想要的 IIS 重写只有what you want,我的意思是用循环动态处理它。

长答案

(1) 仅通过 IIS 重写 ,这是最接近您的问题的可能解决方案:

<rule name="Survey/Result Loop Rule" stopProcessing="true">
    <match url="^(survey|result)/([^/]+)/(.*)$" />
    <action type="Rewrite" url="/{R:1}/{R:3}?{R:2}={R:2}" appendQueryString="true" />
</rule>

<rule name="Survey/Result Default Rule" stopProcessing="true">
    <match url="^(survey|result)/$" />
    <action type="Rewrite" url="/{R:1}.htm" appendQueryString="true" />
</rule>

只要 url 包含参数作为子文件夹,它就会模拟一个循环,对于 /survey//result/。然后,它最终将其重写为附加查询字符串的 .htm 页面。这不可能通过递增数字来动态生成查询名称,例如 var1 var2 等(至少,如果存在解决方案,那将是非常棘手和繁重的,因为重写引擎没有制作为了这)。在此示例中,查询名称和值都相同,例如 ?abc123=abc123&email=email

(2) 最干净的方法是将作业委托给脚本:

<rule name="Survey/Result Default Rule" stopProcessing="true">
    <match url="^(survey|result)/(.*)$" />
    <action type="Rewrite" url="/{R:1}.htm?params={R:2}" />
</rule>

此规则将 /survey/XXX/YYY/ZZZ/ 重写为 /survey.htm?params=XXX/YYY/ZZZ/。由于作业已委托给脚本,因此您的 htm 文件需要实现如下内容(伪代码):

params = query_get('params');
// remove trailing slash in params if present

parameters = explode("/", query_get('params'))

for (i = 0; i < count(parameters); i++)
    var{i+1} = parameters[i]

// var1 = parameters[0]
// var2 = parameters[1]
// var3 = parameters[2]
// and so on...

我想你明白了。