即使模式匹配,也会跳过IIS重写规则

时间:2012-05-15 00:09:06

标签: iis redirect url-rewriting

对于模糊的标题感到抱歉,问题太复杂了,无法用简短的短语来概括......

我正在尝试设置以下重定向规则:

  1. blog.mydomain.net/en/something:重定向到www.mydomain.com/something
  2. blog.mydomain.net/fr/something:重定向到www.mydomain.fr/something
  3. blog.mydomain.net/*:重定向到www.mydomain.com
  4. 规则3正在运行,但似乎跳过了规则1和规则2,因此始终应用规则3。这是我的web.config规则:

    <!-- Canonicalize mydomain.com to www.mydomain.com -->
    <rule name="CanonicalHostNameRule_en" stopProcessing="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{HTTP_HOST}" pattern="^mydomain\.com$" />
        </conditions>
        <action type="Redirect" url="http://www.mydomain.com/{R:1}" />
    </rule>
    
    <!-- Canonicalize mydomain.fr to www.mydomain.fr -->
    <rule name="CanonicalHostNameRule_fr" enabled="true" stopProcessing="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{HTTP_HOST}" pattern="^mydomain\.fr$" />
        </conditions>
        <action type="Redirect" url="http://www.mydomain.fr/{R:1}" />
    </rule>
    
    <!-- Redirect blog.mydomain.net/en/something to www.mydomain.com/something -->
    <rule name="RedirectBlog_en" enabled="true" stopProcessing="true">
        <match url="^/en(/.*)?$" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{HTTP_HOST}" pattern="^blog\.mydomain\.net$" />
        </conditions>
        <action type="Redirect" url="http://www.mydomain.com/{R:1}" />
    </rule>
    <!-- Redirect blog.mydomain.net/fr/something to www.mydomain.fr/something -->
    <rule name="RedirectBlog_fr" enabled="true" stopProcessing="true">
        <match url="^/fr(/.*)?$" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{HTTP_HOST}" pattern="^blog\.mydomain\.net$" />
        </conditions>
        <action type="Redirect" url="http://www.mydomain.fr/{R:1}" />
    </rule>
    
    <!-- Redirect blog.mydomain.net/* to www.mydomain.com -->
    <rule name="RedirectBlog_other" enabled="true" stopProcessing="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{HTTP_HOST}" pattern="^blog\.mydomain\.net$" />
        </conditions>
        <action type="Redirect" url="http://www.mydomain.com/" />
    </rule>
    
    <!-- Wordpress-specific rules -->
    ...
    

    我不明白为什么跳过规则RedirectBlog_enRedirectBlog_fr;我测试了正则表达式,它们工作正常。

    有人能发现问题吗?


    编辑:如果我禁用第3条规则(RedirectBlog_other),那么规则1和2工作正常......怎么可能,因为规则1和2在规则3之前执行?

1 个答案:

答案 0 :(得分:1)

好的,我知道了!

首先,事情并没有像我想象的那样发生;当我禁用规则3时,规则1和2 正在工作:我仍然被重定向到我的实际域,但这是由Wordpress完成的,而不是我的规则。

其次,我匹配网址的模式是错误的:输入中包含前导'/',所以我的规则根本不匹配。