Общие сведения о IIS 8.0 Перезапись входящего правила для перенаправления https на http с использованием регулярного выражения

Мне удалось настроить правило перезаписи для моего веб-сайта, используя этот ответ :

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

1
задан 23 May 2017 в 15:41
1 ответ

Я знаю, что это немного устарело, но просто чтобы добавить к нему что-то.

Одним из решений может быть создание дополнительных групп захвата в регулярном выражении для url ] в элементе соответствия правила, чтобы извлечь явные части URL.

Обратной ссылкой {R: 0} всегда будет вся проверяемая строка, поэтому вы можете получить дополнительные Обратные ссылки путем добавления групп захвата, которые будут извлекать интересующие вас подстроки.

Ниже приведен пример регулярного выражения для достижения этого.

Он состоит из 2 групп захвата. Примечание: одна - это группа без захвата

^(?:http:)(.*)
  1. (?: http:) - это группа без захвата, которая обозначается префиксом «?:» В шаблоне, который позволяет сопоставить шаблон, но не включать его в возвращаемые обратные ссылки - он будет соответствовать только строке «http:».

  2. (. *) - это стандартная группа захвата, которая вернет все оставшиеся символы в строке, которая появляется после первой Non-Capture Group - она ​​вернет все после «http:».

Результирующие обратные ссылки группы захвата будут:

  1. {R: 0} :: весь исходный URL-адрес
  2. {R: 1} :: все после "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, чтобы быть уверенным в эффективности.

3
ответ дан 3 December 2019 в 18:31

Теги

Похожие вопросы