Назад | Перейти на главную страницу

Перезапись URL не срабатывает должным образом

У меня было настроено правило перезаписи URL в корне IIS (ApplicationHost.config), который перенаправляет www.example.com на HTTPS. Конфигурация перезаписи URL настраивается на экземпляре IIS за общедоступным балансировщиком нагрузки нашего хостинга, где наш SSL установлен нашим хостинг-провайдером. Балансировщик нагрузки предоставляет нам X-Forwarded-Proto заголовок, который устанавливается на http если исходный запрос находится в HTTP и https если исходный запрос находится в HTTPS.

Перезапись URL настраивается следующим образом:

 Pattern: .*
 Conditions: Match All
             Input                   |Type                |Pattern
             -------------------------------------------------------------
             {HTTP_HOST}             |Matches the Pattern |www.example.com
             {HTTP_X_Forwarded_Proto}|Matches the Pattern |^http$
 Action:
  Redirect to URL: https://{HTTP_HOST}{REQUEST_PATH}
  Redirect Type  : 302

Проблема в том, что у нас был сценарий PowerShell, который был установлен на самом веб-сервере, чтобы проверить, доступен ли сайт или нет, используя [System.Net.WebRequest]::Create($siteUrl). Сценарий чаще всего сообщает HTTP 200 (OK), но иногда дает сбой 404 HTTP Error. Поскольку сценарий PowerShell выполняется локально, он не должен иметь X-Forwarded-Proto заголовок и никогда не получить 404 от IIS.

Возможно ли, что URL Rewrite сработал, а не должен?

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

Вот моя догадка: Это зависит от файлов хостов и / или DNS-сервера, настроенного на самом сервере IIS. Однако даже при локальном запуске www.example.com может возвращаться к IP-адресу балансировщика нагрузки, и запрос может возвращаться через балансировщик нагрузки и, следовательно, иметь заголовок X-Forwarded-Proto. Мы сможем увидеть, присутствует ли заголовок с помощью трассировки неудачных запросов.

Заметка (в основном из моего ОКР): я бы рекомендовал изменить шаблон с www.example.com на www (обратная косая черта) .example (обратная косая черта) .com, чтобы указать при перезаписи URL, что точка (.) является буквальной точкой, а не точка дикого символа. Замените (обратную косую черту) фактическим символом. Похоже, ТАК убирает за меня характер.