Angular 2 Hosted on IIS: HTTP Error 404

30,360

Solution 1

We have to make IIS fall back to index.html by adding a rewrite rule.

Step 1: Install IIS URL Rewrite Module

Step 2: Add a rewrite rule to web.config

   <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.webServer>
        <rewrite>
          <rules>
            <rule name="AngularJS 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>

Solution 2

STEP 3: add web.config link to angular.json: (because after ng build it will skipped)

"architect": {
                "build": {
                    "builder": "@angular-devkit/build-angular:browser",
                    "options": {
                         ..........
                        "assets": [
                            "src/favicon.ico",
                            "src/assets",
                            **"src/web.config"**
                        ]

Solution 3

If you are using an IIS application like myApp below your default web site (then the URL to your application should have the syntax http://localhost/myApp/my-angular-route), then you should try to modify the action to

<action type="Rewrite" url="/myApp/"/>;

Then it works for my environment without any problems.

Step by step instructions can be found here: https://blogs.msdn.microsoft.com/premier_developer/2017/06/14/tips-for-running-an-angular-app-in-iis/

Solution 4

Modify angular routing by adding # after baseurl:

http://localhost:4200/yourApp#/subPageRoute

In app-routing.module.ts on line with RouterModule.forRoot add ", { useHash: true }"

RouterModule.forRoot(routes, { useHash: true })

This way IIS thinks everything after # is some id on page and ignores it.

Share:
30,360
Hussein Salman
Author by

Hussein Salman

Engineering Manager &amp; Cloud-Native Architect, focusing on Kubernetes, Containers &amp; Microservices. Check out my youtube channel: https://www.youtube.com/channel/UCoAh8g6dmwXQUwKhkggUFIA

Updated on July 13, 2022

Comments

  • Hussein Salman
    Hussein Salman almost 2 years

    I have simple app with one component that expects certain parameters from url. there is only one route in the application:

    const appRoutes: Routes = 
                           path: 'hero/:userId/:languageId',component: HeroWidgetComponent }];
    

    In the Index.html, I have this in the header <base href="/">

    I am using webpack and the application runs fine on development environment, when browsing the url: http://localhost:4000/hero/1/1.

    However, when building the app for production and getting the distribution files, then hosting that on IIS. I get the following Error when trying to browse the same url:

    HTTP Error 404.0 - Not Found
    The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
    

    The application works fine if I remove all the routing and just browse: http:localhost:4200 on the IIS.