IIS перенаправляет HTTP на HTTPS для тех же доменных имен в том же IIS

У меня частный случай: на одном IIS есть сайты:

  1. sub.domain.com - у него http на 80 и https на 443. Он отлично работает с вашим способом перенаправления с http на https

         <configuration>
             <system.webServer>
                 <rewrite>
                     <rules>
                         <rule name="HTTPS force" enabled="true" stopProcessing="true">
                             <match url="(.*)" />
                             <conditions>
                                <add input="{HTTPS}" pattern="^OFF$" />
                             </conditions>
                             <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" 
                redirectType="Permanent" />
                       </rule>
                   </rules>
                </rewrite>
             </system.webServer>
      </configuration>
    
  2. http://sub.domain.com:5000 и https//sub.domain.com:5001 . Тот просто отказывается переходить с http на https на нужный порт. Он может направлять с http://sub.domain.com:5000 на https://sub.domain.com:5000 вместо https://sub.domain.com:5001. Если мы не очистим данные о просмотре, он будет работать только один раз с http://sub.domain.com:5000 на https://sub.domain.com:5001. Правилу нравится

         <rule name="HTTP to HTTPS on different SSL Port" enabled="true" stopProcessing="true">
        <match url="(.*)" ignoreCase="true" />
           <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
               <add input="{HTTPS}" pattern="off" />
               <add input="{HTTP_HOST}" pattern="([^/:]*?):[^/]*?" />
           </conditions>
        <action type="Redirect" url="https://{C:1}:5001/{R:0}" appendQueryString="false" />
     </rule>
    

Итак, мой вопрос заключается в том, как я могу перенаправить http://sub.domain.com:5000 на https://sub.domain.com:5001 успешно без очистки данных просмотра и т. д.?

ОБНОВЛЕНИЕ:

После того, как я зарегистрировал запрошенный журнал с ошибкой, я кое-что нашел. У меня есть 18 файлов в FailedReqLogFiles\W3SVC4. Каждый из них имеет другой requestURL.

  1. Первый — http://somedomain.com:5000/, код состояния 301;
  2. Второй — https://somedomain.com:5001/, код состояния 200.
  3. Третий — https://somedomain.com:5001/inline.e576fger98965b3219.bundle.js, код состояния 200.
  4. Четвертый — https://somedomain.com:5001/polyfills.3bed24531fd9085545fdw.bundle.js, код состояния 200.
  5. Так далее.....
  6. Последний (18-й) https://somedomain.com:5001/assets/images/action,jpg.

Если я посмотрю на узлы GENERAL_ENDPOINT_INFORMATION на вкладке «Сведения о запросе». В каждом файле журнала отображается Failed To Complete.

ВАЖНО:

Это ядро ​​.net плюс угловое приложение. Я не уверен, должен ли я настраивать ssl и перенаправлять https в сторону angular, а не в IIS или в обе стороны?


person Bigeyes    schedule 16.08.2020    source источник
comment
У вас есть Strict-Transport-Security заголовки ответа http? Это да, тогда это может объяснить, почему это срабатывает один раз после очистки кеша. en.wikipedia.org/wiki/HTTP_Strict_Transport_Security   -  person Stanislav Berkov    schedule 26.08.2020
comment
@StanislavBerkov, он у меня есть. Strict-Transport-Security: max-age=2592000   -  person Bigeyes    schedule 26.08.2020
comment
Но в настройках HTTP-заголовка углового кода у меня этого нет. Должен ли я добавить его в Angular?   -  person Bigeyes    schedule 26.08.2020
comment
Я говорю, что Strict-Transport-Security может быть основной причиной проблемы. Попробуйте удалить его.   -  person Stanislav Berkov    schedule 26.08.2020
comment
@StanislavBerkov, я не знаю, как его удалить. В IIS я не добавляю его в заголовки ответа. Заголовки ответов содержат только X-Powered-By: ASP.NET.   -  person Bigeyes    schedule 26.08.2020


Ответы (2)


Вы можете попробовать следующее правило:

 <rule name="HTTP to HTTPS on different SSL Port" enabled="true" stopProcessing="true">
                <match url="(.*)" ignoreCase="true" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
                    <add input="{HTTPS}" pattern="off" />
                    <add input="{SERVER_PORT}" pattern="^2000$" />
                    <add input="{HTTP_HOST}" pattern="([^/:]*?):[^/]*?" />
                </conditions>
                <action type="Redirect" url="https://{C:1}:2001/{R:1}" appendQueryString="false" />
            </rule>

Примечание. Установите номер порта в соответствии с привязкой и требованиями вашего сайта.

введите здесь описание изображения

также попробуйте установить параметр кэша клиента iis.

https://docs.microsoft.com/en-us/iis/configuration/system.webserver/staticcontent/clientcache

person Jalpa Panchal    schedule 17.08.2020
comment
Я думаю, что ваши правила работают только в том случае, если в IIS есть только уникальное доменное имя. Если у вас есть другой сайт с таким же, возможно, он не работает. Пожалуйста, см. настроить 2 сайта в iis сервера Windows 2016"> ​​stackoverflow.com/questions/61890199/. Комментарии в этом ответе могут быть полезны. Пожалуйста, подтвердите это. Спасибо. - person Bigeyes; 17.08.2020
comment
И я добавил отслеживание неудачных запросов. Я получил только REWRITE_DISABLED_KERNEL_CACHE предупреждение. Не уверен, что это связано. - person Bigeyes; 17.08.2020
comment
@Bigeyes, не могли бы вы поделиться журналом трассировки неудачных запросов, как показано на этом изображении. изображение. доменное имя для того же сайта для HTTP и https в порядке. но номер порта должен быть другим. и, если возможно, рекомендуется использовать порт по умолчанию для https 443. - person Jalpa Panchal; 18.08.2020
comment
@Bigeyes, не могли бы вы рассказать подробнее, что вы имеете в виду под Если у вас есть другой сайт с таким же, возможно, он не работает. вы используете одно и то же доменное имя для разных сайтов? - person Jalpa Panchal; 18.08.2020
comment
Я имею в виду, что если у вас есть http://www.somedomain.com:80 и https://www.somedomain.com:443, это нормально для перенаправления http на https. Но в моем случае на том же IIS. Я разрабатываю новый сайт с тем же доменным именем и разными портами, чтобы различать существующие сайты. Итак, у меня есть сайты http://www.somedomain.com:5000 и https://www.somedomain.com:5001. Другими словами, у меня одно и то же доменное имя для разных сайтов. Перенаправление не работает для развивающихся сайтов, но работает для существующих сайтов. Если мы не очищаем данные просмотра каждый раз. - person Bigeyes; 18.08.2020
comment
Другими словами, у меня есть 4 сайта http://www.somedomain.com:80;https://www.somedomain.com:443;http://www.somedomain.com:5000 и https://www.somedomain.com:5001. Первые два сайта могут быть перенаправлены, последние два сайта не могут быть перенаправлены, если мы каждый раз не очищаем данные просмотра. - person Bigeyes; 18.08.2020
comment
я делаю тест на своем сайте, как вы объясняете на моем сайте, оба сайта работают правильно, без очистки истории браузера. проверьте изображение - person Jalpa Panchal; 19.08.2020
comment
Обновляю информацию, проверяйте. Это ядро ​​asp.net и угловое приложение. - person Bigeyes; 19.08.2020
comment
@Bigeyes, в каком браузере возникает эта проблема? вы пробовали другие браузеры? - person Jalpa Panchal; 21.08.2020
comment
Я пробовал в Microsoft Edge и Chrome. То же самое.... - person Bigeyes; 25.08.2020
comment
Нужно ли устанавливать модуль ARR? - person Bigeyes; 26.08.2020
comment
@Bigeyes нет необходимости устанавливать arr для правила перезаписи URL. это не обязательно. не могли бы вы проверить frt для somedomain.com:5000 этого URL. RULE_EVALUATION_END Succeeded является истинным или ложным? - person Jalpa Panchal; 26.08.2020
comment
Если я сначала очистил кеш, то FailedReqLog вообще не создается. Его можно перенаправить. В противном случае это не удалось, также до сих пор нет журнала. Мой журнал в посте может быть чем-то другим, когда я изменил файл web.config. Вроде не связано. Извините за недопонимание. - person Bigeyes; 26.08.2020

После нескольких дней борьбы. Наконец я нахожу решение.

Я должен сделать две вещи.

  1. Применение правил в IIS

    <rule name="HTTP to HTTPS on different SSL Port" enabled="true" stopProcessing="true">
    <match url="(.*)" ignoreCase="true" />
       <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
           <add input="{HTTPS}" pattern="off" />
           <add input="{HTTP_HOST}" pattern="([^/:]*?):[^/]*?" />
       </conditions>
    <action type="Redirect" url="https://{C:1}:5001/{R:0}" appendQueryString="false" />
    
  2. Удалите HSTS из основного кода .net. у меня был код

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
           app.UseHsts();
    

Удалите его, тогда работает. Спасибо, @StanislavBerkov!

person Bigeyes    schedule 26.08.2020