2012-02-02 4 views
13

Я использую эти два правила в моем файле web.config:IIS URL Перезапись: Принудительно каноническое имя хоста & HTTP к HTTPS перенаправлять

<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 ... Почему?
+0

Просто проверяю, у вас определенно есть текст прямо в пункте 2 выше, - что http://mysite.com переадресовывает успешно до http * s *: //www.mySite.com? –

+0

Они не чувствительны к регистру, не так ли? - в некоторых местах вы использовали mySite, в других mysite (например, в пункте 3). –

+0

Я только что использовал адрес www.mysite.com вместо моего фактического адреса :) –

ответ

22

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

<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» и приведет к дублированию запросов.

+0

Это лучшее решение, которое я нашел. Большинство других примеров жесткого кода имя домена, но этого нет, поэтому он намного более мощный. –

+0

потрясающий! благодаря –

5

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

<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>