Angular2 routing / deep linking not working with Apache 404

前端 未结 7 2004
自闭症患者
自闭症患者 2020-11-29 01:17

I am following the Angular 2 routing examples. Using the \"lite\" webserver I am able to navigate from the root and deep linking works, but using Apache I can navigate fro

相关标签:
7条回答
  • 2020-11-29 01:58

    If you are working with the ionic build and upload your site on hosting server then you need to add the .htaccess file on your root directory inside the www folder.

        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} -s [OR]
        RewriteCond %{REQUEST_FILENAME} -l [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^.*$ - [NC,L]
        RewriteRule ^(.*) / [R=302,NC,L]
    
    
    
    0 讨论(0)
  • 2020-11-29 02:00

    You have to make your server handle all routes back to index.html or use HashLocationStrategy

    (https://angular.io/docs/ts/latest/api/common/index/HashLocationStrategy-class.html)

    Take a look at:

    Is Angular 2's Router broken when using HTML5 routes?

    0 讨论(0)
  • 2020-11-29 02:01

    According to Rein Baarsma answer you have to create .htaccess file and put it in the same directory as your index.html on your Apache server. It might be for example htdocs directory, but this depends on your Apache configuration.

    However I use different .htaccess file content and it works for me for all links/routes without necessity to specify rewrite base:

    <IfModule mod_rewrite.c>
      Options Indexes FollowSymLinks
      RewriteEngine On
      RewriteRule ^index\.html$ - [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . /index.html [L]
    </IfModule>
    

    It is a modification of code provided by Rein Baarsma.

    My app is Angular 2+ (4.x.x) application based on angular-cli project. It hardly depends on direct URLs to addresses provided by Angular routing. Without .htaccess file above I got 404 not found after clicking every direct URL link. Now with use of this .htaccess file everything works fine.

    0 讨论(0)
  • 2020-11-29 02:17

    For angular4/angular in app.routes.module.ts include useHash as below,

    @NgModule({
      imports: [RouterModule.forRoot(routes, {useHash: true})],
      exports: [RouterModule]
    })
    
    0 讨论(0)
  • 2020-11-29 02:18

    As the other answers don't really answer the question for if you want it to work with Apache. HashLocationStrategy remains an option, but if you want it to work as is on Apache you need to do the following:

    Create a new file .htaccess in the same location as your index.html. The following code will be inside:

    <IfModule mod_rewrite.c>
      Options Indexes FollowSymLinks
      RewriteEngine On
      RewriteBase /crisis-center/
      RewriteRule ^index\.html$ - [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . index.html [L]
    </IfModule>
    

    (Note that in the question the <base href="/crises-center/"> inside the index.html should be identical to the RewriteBase)

    Answer adapted from question+answer from Angular 2 routing and direct access to a specific route : how to configure Apache?

    0 讨论(0)
  • 2020-11-29 02:22

    Either in httpd.conf or in apache2.conf add the following:

    <Directory "/var/www/html/">
        Options FollowSymLinks
        Allow from all
        AllowOverride All
    </Directory>
    
    • Change "/var/www/html/" to your website location

    And in .htaccess paste:

    RewriteEngine On
          # If an existing asset or directory is requested go to it as it is
          RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
          RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
          RewriteRule ^ - [L]
          # If the requested resource doesn't exist, use index.html
    RewriteRule ^ /index.html
    
    0 讨论(0)
提交回复
热议问题