У меня было настроено правило перезаписи 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, что точка (.) является буквальной точкой, а не точка дикого символа. Замените (обратную косую черту) фактическим символом. Похоже, ТАК убирает за меня характер.