Mam bardzo prosty projekt, który ma następujące routing.

const routes: Routes = [
  { path: "start", component: StartComponent },
  { path: "sub01", component: Sub01Component },
  { path: "", redirectTo: "/start", pathMatch: "full" },
  { path: "**", component: StartComponent }
];

Po uruchomieniu go lokalnie za pomocą ng serve i przeglądanie do localhost: 4200 , mogę zobaczyć zawartość strony wyjściowej, a adres URL jest przepisany do LocalHost: 4200 / Start , tak jak oczekiwano. Następnie wyprodukowałem półfinałową wersję przez Ng Build i umieścić w katalogu DIST w moim IIS. Przeglądanie adresu aplikacji wytwarza ten sam wynik jak powyżej. Mogę również potwierdzić, że przeglądanie na e.g. URL obrazy również produkują oczekiwany wynik.

Różnica, jak zauważyłem, jest to lokalnie, działa na przeładowanie strony (tj. Surfowanie do Localhost: 4200 / Start ) Podczas gdy ta sama operacja na pilocie nie powiedzie się, dając mi 404 (tak surfowanie http://address.that-worked-just.now/start nie działa). Ponieważ mogę uzyskać dostęp do innych adresów URL niż tylko korzenia, wydaje mi się, że to tylko routing, który nie działa.

Jestem trochę flupbergastowany przez to zachowanie i nie jestem pewien, jak go zdiagnozować. Jedyną różnicą Jestem świadomy w moim zasięgu, jest to, że lokalnie służę aplikacji za pomocą domyślnego kątowego CLI podczas pilota, mam IIS, który służy index.html zawierający skrypt. Więc, więc po tym, jak dokument zostanie wyprodukowany do klienta, wszystko inne dzieje się na kliencie. (Aplikacja jest naprawdę ograniczona i nie ma interakcji z serwerem, brak usług itp., Ponieważ jest to zasadniczo strona docelowa, przynajmniej na razie).

Brakuje mi czegoś, co należy ogłosić w dowolnym z plików konfiguracyjnych? Czy jest to dziwne zachowanie, które prawdopodobnie wystąpi z powodu niektórych polityki zapory lub takiej? Nie jestem pewien, jak to określić, a raczej zakładam, że zrobiłem coś głupiego niż winić zespół serwera. Biorąc pod uwagę opis powyżej, co można wywnioskować?

-2
Konrad Viltersten 3 sierpień 2020, 14:25

1 odpowiedź

Najlepsza odpowiedź

IIS ma swój własny system routingu. Więc kiedy organizujemy kątowe w IIS, routing kątowy zostanie zawiódł, ponieważ IIS nie rozumie routingu kątowego i będzie szukał zasobu, który pasuje do trasy i daje błąd 404.

Aby rozwiązać problem, możesz spróbować jednego z poniższych rozwiązań:

Użyj reguły przepisywania URL IIS, aby ustawić routing:

<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="/index.html" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

Źródło: https://angularny.io/guide/Deployment#fallback-Configuration-Examples / A >.

Innym sposobem jest dodanie strony błędu dla 404, aby przekierować do /index.html.

enter image description here

2
jonrsharpe 2 wrzesień 2020, 08:28