重定向规则不起作用

时间:2017-05-18 17:50:20

标签: iis url-rewriting

我正在尝试为我的网站添加转发规则。如果匹配以下任何URL:

  1. https://www.example.com
  2. http://example.com
  3. http://www.example.com
  4. 然后它应该重定向到

    https://example.com

    我在Windows 2016上使用URL Rewrite 2 for IIS。

    我正试图将其分解为2条规则,因为我无法想到如何做到这一点。规则的第一部分是从http到https

    <rule name="HTTP to HTTPS redirect" stopProcessing="true">
          <match url="(.*)"/>
          <conditions>
            <add input="{HTTPS}" pattern="^OFF$" ignoreCase="true"/>
            <add input="{HTTP_HOST}" pattern="localhost" negate="true"/>
          </conditions>
          <action type="Redirect" redirectType="Permanent" url="https://{HTTP_HOST}/{R:1}"/>
        </rule>
      </rules>
    

    以上作品。

    现在我需要使用https://www来处理https://这似乎没有做任何事情

    <rule name="www to no subdomain redirect" stopProcessing="true">
              <match url="(.*)"/>
              <conditions>
                <add input="{HTTP_HOST}" pattern="^www" ignoreCase="true"/>
              </conditions>
              <action type="Redirect" redirectType="Permanent" url="https://{HTTP_HOST}/{R:1}"/>
            </rule>
          </rules>
    

    这意味着如果我使用http输入规则,那么当我输入https://www.example.com时,它不会转发到https://example.com

    我做错了什么?

2 个答案:

答案 0 :(得分:1)

试试这个

<rules>
                <clear />
                <rule name="CanonicalHostNameRule1" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                        <add input="{HTTP_HOST}" pattern="^example\.com$" negate="true" />
                    </conditions>
                    <action type="Redirect" url="https://example.com/{R:1}" />
                </rule>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                        <add input="{HTTPS}" pattern="^OFF$" ignoreCase="true" />
                        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
                </rule>               
      </rules>

我有两个规则,但只有一个规则会随时执行,并确保涵盖所有逻辑。

在“www到无子域重定向”规则中,您在重定向中使用{HTTP_HOST},这将是www.example.com。

希望这有帮助!

答案 1 :(得分:1)

  

我做错了什么?

{HTTP_HOST}是其范围内的常量,因此您可以从A重定向到A.

查看我写的以下规则。

规则#1 与以www.开头的所有主机名匹配,删除www.重定向到HTTPS。

规则#2 与除了对localhost的请求之外的所有非安全请求匹配,然后通过重复与规则#1中相同的过程重定向。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Redirect-AllWWW-ToSecureNonWWW">
                    <match url=".*" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^(?:www\.)(.+)$" />
                    </conditions>
                    <action type="Redirect" url="https://{C:1}/{R:0}"/>
                </rule>
                <rule name="Redirect-AllNonSecure-ToSecureNonWWW-ExcludingLocalhost">
                    <match url=".*" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^localhost$" negate="true" />
                        <add input="{HTTPS}" pattern="^off$" />
                        <add input="{HTTP_HOST}" pattern="^(?:www\.)?(.+)" />
                    </conditions>
                    <action type="Redirect" url="https://{C:1}/{R:0}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>