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

时间:2012-10-17 12:00:31

标签: iis-7 url-rewriting

我正在使用iis7的URL Rewrite模块完成以下几项工作:

  • 301重定向规则从非www到www
  • 301将规则.info重定向到.com(移至我的域的.com版本)
  • 301从旧网页重定向规则,例如/page-name.asp到/ 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>

2 个答案:

答案 0 :(得分:6)

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

我所谈论的问题实际上被称为“301重定向链接”,解决方案的呈现相当优雅,在这里:

http://www.seomoz.org/blog/what-every-seo-should-know-about-iis#chaining

答案 1 :(得分:0)

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

1)代替重定向,应用带有附加符号_

重写

2)添加新规则,该规则将以_开头并应用重定向

<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>