Мне удалось настроить правило перезаписи для моего веб-сайта, используя этот ответ :
<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
и нажмите Test, я получить {R: 0}
= http://www.example.com/subdir/?param=value
.
Это имеет смысл, поскольку *
выражение регулярного выражения будет соответствовать всей строке.
Вопрос: Как механизм перезаписи URL получает https://www.example.com/subdir/?param=value
вместо https://www.example.com /http://www.example.com/subdir/?param=value[11128603 impression?
Я знаю, что это немного устарело, но просто чтобы добавить к нему что-то.
Одним из решений может быть создание дополнительных групп захвата в регулярном выражении для url ] в элементе соответствия правила, чтобы извлечь явные части URL.
Обратной ссылкой {R: 0} всегда будет вся проверяемая строка, поэтому вы можете получить дополнительные Обратные ссылки путем добавления групп захвата, которые будут извлекать интересующие вас подстроки.
Ниже приведен пример регулярного выражения для достижения этого.
Он состоит из 2 групп захвата. Примечание: одна - это группа без захвата
^(?:http:)(.*)
(?: http:)
- это группа без захвата, которая обозначается префиксом «?:» В шаблоне, который позволяет сопоставить шаблон, но не включать его в возвращаемые обратные ссылки - он будет соответствовать только строке «http:».
(. *)
- это стандартная группа захвата, которая вернет все оставшиеся символы в строке, которая появляется после первой Non-Capture Group - она вернет все после «http:».
Результирующие обратные ссылки группы захвата будут:
Таким образом, атрибут url в вашем узле match будет изменен следующим образом:
<match url="^(?:http:)(.*)" />
И атрибут url в вашем узел action будет изменен следующим образом:
<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, чтобы быть уверенным в эффективности.