Iis 7 将多个IIS7重写规则(重定向)合并为一个

Iis 7 将多个IIS7重写规则(重定向)合并为一个,iis-7,url-rewriting,Iis 7,Url Rewriting,我正在使用iis7的URL重写模块完成以下几件事: 301将规则从非www重定向到www 301将rule.info重定向到.com(移动到我的域的.com版本) 301将规则从旧页面(例如/page-name.asp)重定向到just/page-name 我已经能够将前两项合并为一项规则,第三项是它自己的规则。问题是,在请求url的情况下会生成两个301重定向,如: site.info/page-name.asp/ 首先,执行301以: www.site.com/page-name.asp

我正在使用iis7的URL重写模块完成以下几件事:

  • 301将规则从非www重定向到www
  • 301将rule.info重定向到.com(移动到我的域的.com版本)
  • 301将规则从旧页面(例如/page-name.asp)重定向到just/page-name
我已经能够将前两项合并为一项规则,第三项是它自己的规则。问题是,在请求url的情况下会生成两个301重定向,如:

site.info/page-name.asp/

首先,执行301以:

www.site.com/page-name.asp(例如,添加www.info并将其转到.com)

然后,从该步骤执行第二301,以:

www.site.com/page-name

我的问题是:我如何组合这些,以便只发生一个301重定向而不是两个?以下是我的web.config中的两条规则:

<rule name="SEO - 301 Redirect - .info to .com AND force WWW" stopProcessing="false">
    <match url="(.*)" ignoreCase="true" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="^site\.info$" />
    </conditions>
    <action type="Redirect" url="{ToLower:http://www.site.com/{R:1}}" redirectType="Permanent" />
</rule>
<rule name=".aspVersion-to-friendlyvia301" stopProcessing="false">
        <match url="(.*).asp" />
        <action type="Redirect" url="{R:1}" />
</rule>

我似乎找到了我自己问题的答案。这有点像黑客,但可以完成所有必需的url转换(例如,删除尾随斜杠、非www到www、toLowerCase、删除目录的默认文档以及任何其他必要的重定向,如更改页面名称)

我刚才提到的问题实际上被称为“301重定向链接”,解决方案非常优雅,如下所示:


此解决方案来自前面的评论:

1) 而不是重定向应用用附加符号重写_

2) 添加新规则,以赶上以u开头的URL并应用重定向

<rule name="LowerCaseRule1" stopProcessing="false">
      <match url="(.*)" ignoreCase="false" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_METHOD}" pattern="GET" />
        <add input="{R:1}" pattern="[A-Z]" ignoreCase="false" />
      </conditions>
      <action type="Rewrite" url="_{ToLower:{R:1}}" />
</rule>
<rule name="RemoveTrailingSlashRule1" stopProcessing="false">
      <match url="(.*)/$" />
      <conditions  logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_METHOD}" pattern="GET" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
      </conditions>
      <action type="Rewrite" url="_{R:1}" />
    </rule>
<rule name="Final redirect" stopProcessing="true">
      <match url="^(_+)(.*)" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_METHOD}" pattern="GET" />
      </conditions>
      <action type="Redirect" url="{R:2}" />
</rule>


由于外部页面可能会在当前页面之前消失,因此最好总是从答案中的链接中提取并重新表述解决方案。(虽然仍然提供链接,至少是信用卡。)是的,在这种情况下,这是相当多的工作。你能在这里分享你的代码行吗。那真的很有帮助。我无法在您共享的链接上找到任何显示两个或多个规则合并的内容!没有规则的“合并”-您将只是链接规则,IIS将处理所有规则,并根据您的情况执行单个重写或重定向。尝试本文中的规则,并使用Fiddler监控发生的情况,您将看到它是如何工作的。这只是一种替代解决方案吗?你能解释一下为什么我想用这个而不是前一个吗?不,这是一个有具体细节的解决方案。