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

Я использую эти два правила в своем файле 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>

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

  1. http://www.example.com ---> https://www.example.com
  2. http://example.com --- > https://www.example.com
  3. https://example.com---> это не перенаправляет на https://www.example.com ... Почему?

Ответы [ 2 ]

24 голосов
/ 27 апреля 2012

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

<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 = "Permanent" будетприведет к тому, что правило будет применено, пока история / кэш браузера не будут очищены;это должно быть хорошо, так как браузер будет работать дальше.Кроме того, appendQueryString = "false" необходимо, поскольку переменная сервера {HTTP_URL} уже содержит полную строку запроса;по умолчанию эта опция имеет значение "true" и может привести к дублированию строк запросов.

6 голосов
/ 18 ноября 2014

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

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...