Переписывание URL-адресов IIS7: как отказаться от протокола HTTPS от переписанного URL-адреса?
Я работаю на веб-сайте, который использует функцию перезаписи URL-адресов IIS 7, чтобы сделать постоянную переадресацию с example.com на www.example.com, а также переписывать схожих доменных имен на "главный", например от www.examples.com до www.example.com.
Это правило перезаписи - показано ниже - хорошо работает уже некоторое время. Тем не менее, мы недавно добавили поддержку HTTPS и заметили, что если пользователи перейдут на один из URL-адресов, которые будут переписаны на www.example.com, то HTTPS будет удален. Например, если пользователь посещает https://example.com, они перенаправляются на http://www.example.com, тогда как мы хотели бы, чтобы они были отправлены на https://www.example.com.
Здесь приведенное правило перезаписи (в Web.config):
<rule name="Canonical Host Name" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_HOST}" pattern="^example\.com$" />
<add input="{HTTP_HOST}" pattern="^(www\.)?example\.net$" />
<add input="{HTTP_HOST}" pattern="^(www\.)?example\.info$" />
<add input="{HTTP_HOST}" pattern="^(www\.)?examples\.com$" />
</conditions>
<action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>
Как вы можете видеть, атрибут url элемента действия указывает прямо на http://, поэтому я понимаю, почему https://example.com перенаправляется http://www.example.com. Мой вопрос: как мне это исправить? Я попытался (наивно) просто отбросить часть http://из атрибута url, но это не сработало.
Ответы
Ответ 1
Придумал ответ с некоторой помощью моих коллег.
Мне нужно было использовать несколько правил с условием на {HTTPS}. Обратите внимание на условие {HTTPS} в приведенных ниже правилах.
<rule name="Canonical Host Name (HTTP)" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTPS}" pattern="OFF" />
<add input="{HTTP_HOST}" pattern="^example\.com$" />
</conditions>
<action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>
<rule name="Canonical Host Name (HTTPS)" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTPS}" pattern="ON" />
<add input="{HTTP_HOST}" pattern="^example\.com$" />
</conditions>
<action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" />
</rule>
Затем я повторил пару правил выше для альтернативных имен доменов.
Ответ 2
Здесь Скотт отвечает с улучшениями Хасана. Это должно охватывать смешанные сайты SSL/non-SSL. В основном правило гласит: "Если у URL-адреса нет www.example.com", выполните постоянную переадресацию на него. По сути... вы перенаправляете людей, которые посещают вас без www или напрямую на ваш IP-адрес.
<rewrite>
<rules>
<rule name="Canonical Host Name" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^www\.example\.com$" negate="true" />
</conditions>
<action type="Redirect" url="{MapSSL:{HTTPS}}www.example.com/{R:1}" redirectType="Permanent" />
</rule>
</rules>
<rewriteMaps>
<rewriteMap name="MapSSL" defaultValue="http://">
<add key="ON" value="https://" />
<add key="OFF" value="http://" />
</rewriteMap>
</rewriteMaps>
</rewrite>
Ответ 3
Если вы просто хотите перенаправить на основе используемого в настоящее время протокола (в соответствии с вашим последним образцом), там будет гораздо более простое решение, которое позволит вам сократить вдвое количество правил, которые вам понадобятся. Вот что я узнал из моего коллеги.
Как вы видели, аргумент {HTTPS} будет содержать значение ON или OFF. Вы можете сопоставить это значение с https://или http://, введя это значение в rewritemap.
Вот как это будет работать:
1- Создайте раздел rewritemap для сопоставления значения {HTTPS}:
<rewriteMap name="MapProtocol" defaultValue="OFF">
<add key="ON" value="https://" />
<add key="OFF" value="http://" />
</rewriteMap>
Вам решать, хотите ли вы включать только протокол, точку с запятой и прямую косую черту. Это не имеет значения для решения, но имейте это в виду, где бы вы ни ссылались на него.
2- Обратитесь к этой карте, где вам нужно. В этом примере он используется в исходящих правилах, но он также будет работать в вашем сценарии:
<rule name="Outbound-Rule Name" stopProcessing="true" preCondition="ResponseIsHtml">
<match filterByTags="A, Link, Script" pattern="YOUR PATTERN" />
<action type="Rewrite" value="{MapProtocol:{HTTPS}}{HTTP_HOST}/REST OF RELATIVE LINK HERE" />
</rule>
Чтобы он, модуль URL Rewrite теперь должен автоматически использовать правильный протокол для ваших ссылок в зависимости от того, используете ли вы https или, конечно же, http.
Надеюсь, это поможет!
Ответ 4
Здесь кросс-доменное решение, которое работает не только на example.com
, но и на любой области
<rewrite>
<rules>
<rule name="Canonical Host Name" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^www\.([.a-zA-Z0-9]+)$" negate="true" />
</conditions>
<action type="Redirect" url="{MapProtocol:{HTTPS}}www.{HTTP_HOST}/{R:0}" redirectType="Permanent" />
</rule>
</rules>
<rewriteMaps>
<rewriteMap name="MapProtocol" defaultValue="OFF">
<add key="ON" value="https://" />
<add key="OFF" value="http://" />
</rewriteMap>
</rewriteMaps>
</rewrite>