Подтвердить что ты не робот

Перенаправление URL-адреса IIS: принудительное использование канонического имени хоста и HTTP для перенаправления HTTPS

Я использую эти два правила в файле web.config:

<rule name="Enforce canonical hostname" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTP_HOST}" negate="true" pattern="^www\.example\.com$" />
      </conditions>
      <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" />
    </rule>
    <rule name="HTTP to HTTPS redirect" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
      </conditions>
      <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
    </rule>

С этими двумя правилами я получаю следующую работу Redirect:

4b9b3361

Ответ 1

Не уверен, что вы все еще ищете ответ, но здесь. После некоторого поиска, проб и ошибок, я нашел успех со следующими правилами. Большинство примеров, с которыми я столкнулся, излишне сложны в отношении сопоставления шаблонов и вводят другие переменные, которые не позволяют правилам работать по назначению. Правила, приведенные ниже, могут быть применены к любому веб-сайту, и ничто не жестко закодировано, поэтому всегда должно быть прямое копирование и вставка:

<rule name="Redirect to WWW" stopProcessing="true" >
    <match url="(.*)" />
    <conditions>
        <add input="{HTTP_HOST}" pattern="^www\." negate="true"/>
    </conditions>
    <action type="Redirect" url="https://www.{HTTP_HOST}{HTTP_URL}" redirectType="Permanent" appendQueryString="false" />
</rule>
<rule name="Redirect to HTTPS">
    <match url="(.*)" />
    <conditions>
        <add input="{HTTPS}" pattern="OFF"/>
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}{HTTP_URL}" redirectType="Permanent" appendQueryString="false" />
</rule>

Следует отметить две вещи: redirectType = "Постоянный" приведет к тому, что правило будет применяться до тех пор, пока история/кеш браузера не будут опущены; это должно быть хорошо, так как браузер будет продолжать работу. Кроме того, appendQueryString = "false" необходимо, так как переменная сервера {HTTP_URL} уже включает полный запрос; по умолчанию опция "true" и приведет к дублированию запросов.

Ответ 2

Если это для кого-то приносит пользу, здесь то же самое получается только с одним правилом:

<rule name="Redirect HTTP to HTTPS and non-WWW to WWW" stopProcessing="true">
    <match url="(.*)"/>
    <conditions trackAllCaptures="false" logicalGrouping="MatchAny"> <!-- match non-HTTPS or non-WWW -->
        <add input="{HTTPS}" pattern="^OFF$"/> <!-- if connection not secure -->
        <add input="{HTTP_HOST}" matchType="Pattern" ignoreCase="true" pattern="^example\.com$" /><!-- domain is not canonical  -->
    </conditions>
    <action type="Redirect" url="https://www.example.com{HTTP_URL}" redirectType="Permanent" appendQueryString="false"/>
</rule>