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}&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...
我想你明白了。
我正在使用 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}&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...
我想你明白了。