Хост-приложение Angular на IIS - перенаправление на root и принудительное использование HTTPS

У меня есть приложение angular, размещенное в IIS. Чтобы перенаправить все запросы в корень приложения и разрешить угловую маршрутизацию работать с различными маршрутами, я добавил файл web.config с правилом перезаписи URL следующим образом:

<configuration>
<system.webServer>
  <rewrite>
    <rules>
     <rule name="Angular Routes" stopProcessing="true">
         <match url=".*" />
       <conditions logicalGrouping="MatchAll">
         <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
       </conditions>
       <action type="Rewrite" url="/" />
     </rule>
  </rules>
 </rewrite>
</system.webServer>
</configuration>

Работает нормально. Однако теперь мне нужно заставить приложение перенаправить с HTTP на HTTPS. Для этого я могу добавить новое правило, как показано в следующем сообщении: https://stackoverflow.com/questions/38334894/angular-2-always-redirect-to-https-instead-of-using-http

Правило принудительного HTTPS:

<configuration>
<system.webServer>
    <rewrite>
        <rules>
            <clear />
            <rule name="Redirect to https" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>
</configuration>

Это правило также работает, но оно нарушает мое перенаправление на корневое правило, определенное ранее. Итак, есть ли у кого-нибудь идея, как я могу смешать эти два правила вместе или каким другим способом я могу достичь обеих целей?


person D.B    schedule 12.02.2018    source источник
comment
у меня такая же проблема .. вы можете ее решить?   -  person Vimal Vataliya    schedule 13.03.2018
comment
В итоге я заставил https прямо в проекте Angular с парой строк кода. Если вы заинтересованы в том же, дайте мне знать, я поделюсь своим кодом с вами.   -  person D.B    schedule 13.03.2018
comment
Конечно .. это будет мне очень полезно. мой проект находится в angular 5.3.2, а проект API - в dot net core 2.1.3. Спасибо.   -  person Vimal Vataliya    schedule 13.03.2018
comment
Конечно, я опубликовал в качестве ответа альтернативное решение   -  person D.B    schedule 13.03.2018


Ответы (2)


В качестве альтернативного решения я в конечном итоге принудительно установил https на основном контроллере в угловом проекте, как показано ниже. (Размещено на случай, если кому-то еще будет полезно)

import { Component, OnInit } from '@angular/core';
import { Location } from '@angular/common';
import { environment } from '../environments/environment';

@Component({
  selector: 'vp-app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
  title = 'vp-app';
  location: Location;

  ngOnInit() {
    if (environment.production) {
      if (location.protocol === 'http:') {
        window.location.href = location.href.replace('http', 'https');
      }
    }
  }
}

person D.B    schedule 13.03.2018
comment
произойдет ли это до перенаправления поставщику удостоверений? - person punkologist; 17.05.2019
comment
у меня работал только на первой ссылке, на всех остальных это был HTTP - person Marcius Bezerra; 06.08.2020

ПЕРЕНАПРАВЛЕНИЕ НА HTTPS И ПЕРЕНАПРАВЛЕНИЕ НА ROOT

Кто-то, кто все еще ищет решение web.config, замените существующий код файла web.config следующим кодом:

<?xml version="1.0" encoding="UTF-8"?>
  <configuration>
   <system.webServer>
    <rewrite>
      <rules>

          <!--START REDIRECT TO HTTPS-->
           <rule name="Redirect to https" stopProcessing="true">
                <match url=".*" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
            </rule>
            <!--END REDIRECT TO HTTPS-->

            <!--START REDIRECT TO ROOT-->
            <rule name="AngularJS" stopProcessing="true">
              <match url=".*" />
               <conditions logicalGrouping="MatchAll">
                  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                  <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
               </conditions>
               <action type="Rewrite" url="/" />
            </rule>
           <!--END REDIRECT TO ROOT-->

         </rules>
      </rewrite>
    </system.webServer>
 </configuration>

Примечание. Для IIS 6 вам может потребоваться установить расширение URL Rewrite, чтобы оно работало.

Вы можете найти расширение URL Rewrite по адресу: https://www.iis.net/downloads/microsoft/url-rewrite

person Arun Saini    schedule 29.06.2018
comment
Это решение хорошо работало для приложения Angular 6, размещенного на IIS 10. - person ruchit; 01.08.2018
comment
Когда я добавляю это в свой файл конфигурации, он вызывает ошибку 500.19 при просмотре сайта. - person Paul; 07.08.2019
comment
@Paul, у вас есть сайт на IIS 6? - person Arun Saini; 07.08.2019
comment
Спасибо, приятель, это помогло перенаправить на https. Ваше здоровье :) - person maverickosama92; 17.10.2020