【问题标题】:IIS Rewrite with optional query string or adding defaults使用可选查询字符串或添加默认值重写 IIS
【发布时间】:2018-01-23 22:37:31
【问题描述】:

我正在使用 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,它显然没有达到调查规则。我尝试了几个&lt;conditions&gt;,但都能找到合适的。

我觉得一定有办法说

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

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

理想情况下是某种类型的 if 循环。无论调查后有多少/,无论是 0 还是 10,它都将始终是调查页面,是否有任何方法可以重写?

我查看了重写图,但不确定是否能解决此问题。

编辑

我想重写的可能网址:

/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”。我希望这更有意义。

【问题讨论】:

  • 如果你能添加 3-5 个示例 URL 以及它应该如何重写它会很棒。那我就可以帮你改写规则了
  • @VictorLeontyev 我尝试添加一些示例,希望对您有所帮助。

标签: mod-rewrite iis url-rewriting web-config


【解决方案1】:

简答

无法完全通过 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 页面,并附加了查询字符串。这不可能通过递增数字来动态生成查询名称,例如var1var2 等(至少,如果存在解决方案,这将非常棘手和繁重,因为重写引擎不是为此而设计的)。在此示例中,查询名称和值都相同,例如 ?abc123=abc123&amp;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...

我想你明白了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2021-02-04
    相关资源
    最近更新 更多