用于多个域和多语言路径的IIS 7.5 WinServer 2008 R2 URL重写模块

时间:2015-11-14 22:09:48

标签: .net iis url-rewriting

我正在尝试利用(根据标题)IIS URL重写模块将一些旧域重定向到新域。我查看了很多MS Tech的文章和各种博客,对于我们的情况,我认为我对所需的解决方案有所了解,但是,我的重定向没有解决,我只得到404错误而不是重定向到页面。

详细说明: 我们目前有一个多语言网站,如域名。 com / 英文/路径/到/页和域。 de / 英文/ Path / To / Page ,domain。 fr / English / Path / To / Page 。我们的CMS - Kentico - 设置为按照顶级域名进行翻译。 我们现在正在迁移到新网站,我们想要域。 com / 英文/路径/到/页和域。 de / 德语/翻译/路径/到/页和域。 fr / 法语/翻译/路径/到/页。 我相信以下是设置'rewriteMaps'的正确方法:

<rewrite>
    <rewriteMaps>
      <rewriteMap name="USRedirects" defaultValue="">
          <add key="/OLD/PATH/" value="/NEW/PATH/ENGLISH" />
          <add key="/OLD/PATH/" value="/NEW/PATH/ENGLISH" />
          <add key="/OLD/PATH/" value="/NEW/PATH/ENGLISH" />
       </rewriteMap>
    </rewriteMaps>
</rewrite>
<rewrite>
    <rewriteMaps>
      <rewriteMap name="DERedirects" defaultValue="">
          <add key="/OLD/PATH/" value="/NEW/PATH/GERMAN" />
          <add key="/OLD/PATH/" value="/NEW/PATH/GERMAN" />
          <add key="/OLD/PATH/" value="/NEW/PATH/GERMAN" />
       </rewriteMap>
    </rewriteMaps>
</rewrite>

注意:“旧路径”都是相同的,都是英文的。只有域(.de,.com,.fr)表示不同。展望未来,新网站已经翻译了每种语言的网址。 然后我将以下设置作为我的规则部分:

<rules>
    <rule name="US Redirects" patternSyntax="ECMAScript" stopProcessing="true">
    <match url=".*" /> <!-- rule back reference is captured here  -->
    <conditions>
        <add input="{USRedirects:{HTTP_HOST}}" pattern="^www.domain.com$" /> <!-- condition back-reference is captured here -->
    </conditions>
    <action type="Redirect" url="http://www.domain.com/{R:1}" redirectType="Permanent" /> <!-- rewrite actions uses back-references to condition and to rule when rewriting the URL -->
     </rule>
   </rules>

<rules>
    <rule name="DERedirects" patternSyntax="ECMAScript" stopProcessing="true">
    <match url=".*" /> <!-- rule back reference is captured here  -->
    <conditions>
        <add input="{USRedirects:{HTTP_HOST}}" pattern="^www.domain.de$" /> <!-- condition back-reference is captured here -->
    </conditions>
    <action type="Redirect" url="http://www.domain.de/{R:1}" redirectType="Permanent" /> <!-- rewrite actions uses back-references to condition and to rule when rewriting the URL -->
     </rule>
   </rules>

最后,我想要为每种语言/域名命名的一组规则(DE = domain.de,US = domain.com,FR = domain.fr等,其中每一个都对应于相应的rewriteMaps(名为DERedirects,USRedirects,FRRedirects等)使用输入值{:{HTTP_HOST}}中的引用语法。

毕竟说完了(并且有很多错误的语法,结果当然是500个错误)这不会崩溃或500对我来说但它唯一能做的就是抛出一个404并说出我的页面想重定向不存在。

任何帮助都会非常赞赏。而且,如果我要遗漏的任何进一步的信息很重要,请告诉我,我会尽我所能提供更多细节。

以下是我一直在使用的几个参考资料:

http://ruslany.net/2010/05/storing-url-rewrite-mappings-in-a-separate-file/

https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

http://weblogs.asp.net/owscott/iis-url-rewrite-redirect-multiple-domain-names-to-one

谢谢!

小更新: 以上部分仅是整体配置的部分内容。我需要的不仅仅是DE和COM设置。

此外,Ruslany的文章我试图实施,但在设置时收到了太多的500错误。语法或设置的东西不能正常工作,所以我将所有的地图和规则直接放到web.config文件中(同时保持每条要求的250kb以下)。

1 个答案:

答案 0 :(得分:0)

找到我的答案!只需要弄清楚/意识到&#34; {:{HTTP_POST}}&#34;由于输入不可能,我可以正确搜索。发现这篇文章:

http://forums.iis.net/t/1177509.aspx

并且,如果从interwebs消失,这里是复制/粘贴版本:

您好,

重写模块中请求url的输入不包含主机名。所以你需要使用{HTTP_HOST}来验证它。您可以按照以下步骤更新规则,以使其有效:

<rewrite>
  <rewriteMaps>
    <rewriteMap name="Site1Redirects">
      <add key="/mypage" value="/EN/mypage.aspx" />
    </rewriteMap>
    <rewriteMap name="Site2Redirects">
      <add key="/mypage" value="/CY/mypage2.aspx" />
    </rewriteMap>
  </rewriteMaps>
  <globalRules>
    <rule name="Redirect rule1 for Site 1" stopProcessing="true">
      <match url=".*" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^site1.mysite.com$" />
        <add input="{Site1Redirects:{REQUEST_URI}}" pattern="(.+)" />
      </conditions>
      <action type="Redirect" url="{C:0}" appendQueryString="false" />
    </rule>
    <rule name="Redirect rule1 for Site 2" stopProcessing="true">
      <match url=".*" />
      <conditions>
        <add input="{HTTP_HOST}" pattern="^site2.mysite.com$" />
        <add input="{Site2Redirects:{REQUEST_URI}}" pattern="(.+)" />
      </conditions>
      <action type="Redirect" url="{C:0}" appendQueryString="false" />
    </rule>
  </globalRules>
</rewrite>

感谢。

这就是......

更新:,因为我发现这是更有价值的信息:

https://moz.com/blog/what-every-seo-should-know-about-iis#chaining