Мне удалось настроить правило перезаписи для моего веб-сайта, используя этот ответ:
<rule name="Redirect from non www" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^example.com$" />
</conditions>
<action type="Redirect" url="https://www.example.com/{R:0}" redirectType="Permanent" />
</rule>
<!-- this is the rule I am interested in -->
<rule name="Redirect from non https" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
<add input="{HTTP_HOST}" pattern="^www.example.com$" />
</conditions>
<action type="Redirect" url="https://www.example.com/{R:0}" redirectType="Permanent" />
</rule>
Однако мне сложно понять, как url
атрибут из action
тег действительно работает. Если я перейду в IIS -> Правила перезаписи -> Перенаправить с не https -> Тестовый шаблон -> введите URL http://www.example.com/subdir/?param=value
и нажмите "Тест", я получаю {R:0}
знак равно http://www.example.com/subdir/?param=value
.
Это имеет смысл, поскольку *
выражение regex будет соответствовать всей строке.
Вопрос: Как механизм перезаписи URL получает https://www.example.com/subdir/?param=value
вместо того https://www.example.com/http://www.example.com/subdir/?param=value
?
Я знаю, что это немного устарело, но просто чтобы добавить к нему кое-что.
Одним из решений может быть создание дополнительных групп захвата в регулярном выражении для url в элемент соответствия правила, чтобы извлечь явные части URL-адреса.
Обратной ссылкой {R: 0} всегда будет вся проверяемая строка, поэтому вы можете получить дополнительные обратные ссылки, добавив группы захвата, которые будут извлекать интересующие вас подстроки.
Ниже приведен пример регулярного выражения для достижения этой цели.
Он состоит из 2 групп захвата. Примечание: one - это группа без захвата
^(?:http:)(.*)
(?:http:)
- это группа без захвата, которая обозначается префиксом «?:» в шаблоне, что позволяет сопоставить шаблон, но не включать его в возвращаемые обратные ссылки - он будет соответствовать только строке «http:».
(.*)
- это стандартная группа захвата, которая вернет все оставшиеся символы в строке, которые встречаются после первой группы без захвата - она вернет все после «http:».
Полученные в результате обратные ссылки группы захвата будут:
Так что url атрибут в вашем соответствие узел будет изменен так:
<match url="^(?:http:)(.*)" />
И url атрибут в вашем действие узел будет так изменен;
<action type="Redirect" url="https:{R:1}" redirectType="Permanent" />
Синтаксис регулярных выражений, поддерживаемый правилами (согласно документации), - это ECMAScript - Perl-совместимый (совместимый со стандартом ECMAScript) синтаксис регулярных выражений.
Дополнительную информацию можно найти в документации MS для IIS: https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference
Имейте в виду, что это очень общее решение, которое может применяться не во всех случаях - всегда проверяйте с помощью функции Test Pattern на экране Edit Rule IIS, чтобы быть уверенным в эффективности.