Deploy angular application on Apache Tomcat 404 deep links issue

后端 未结 2 1701
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-05 15:31

I\'m trying to figure out the way how to setup Apache Tomcat server to serve angular application with deep links. For example:

A static server routinely returns ind

相关标签:
2条回答
  • 2020-12-05 15:58

    For fixing the deep link issue when deploying angular application (with PathLocationStrategy routing) on apache tomcat server (8, 9) -

    1. Configure the RewriteValve in server.xml
    2. Write the rewrite rule in rewrite.config

    server.xml -

    ...
          <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
    
            <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
    
    ...
          </Host>
    ...
    

    rewrite.config - (note - /hello/ is the context path of the angular app on tomcat)

    RewriteCond %{REQUEST_PATH} !-f
    RewriteRule ^/hello/(.*) /hello/index.html
    

    I have documented this issue in my article - Fixing deep linking issue – Deploying angular application on Tomcat server

    Note - there is no client side setup needed for achieving this (apart from the default config coming out of CLI). All the client side routing is handles by the Angular Routing module.

    0 讨论(0)
  • 2020-12-05 16:04

    I managed to fix this problem e.g http://localhost:8080/angular/player/detail/4 with following steps:

    1) Build angular application with: ng build --prod -bh ./ -d /angular

    2) Copy contents of builded app to $ApacheLocation/webapps/angular

    3) Rewrite rule:

    RewriteCond %{REQUEST_PATH} !-f
    RewriteRule ^/angular/(.*) /angular?path=$1
    

    4) Setup navigation at app.component.ts:

    constructor(private activatedRoute: ActivatedRoute, private router: Router) { }
    
    ngOnInit() {
    const path = this.activatedRoute.snapshot.queryParams['path'];
    const navigateTo = '/' + path;
    
    if (path) {
      this.router.navigate([navigateTo]);
    }
    

    }

    You can find test project here: https://github.com/avuletica/test

    Explanation of rewrite rules:

    # %{REQUEST_PATH} corresponds to the full path that is used for mapping.
    # ! NOT character 
    # '-f' (is regular file) Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.
    # ^ matches the beginning of the string or line
    # . matches any charceter except line breaks
    # * match 0 or more of the preceding token
    

    So basically if there is no file on /angular/anything tomcat sends full path as query string to angular application and from that query param angular handles routing.

    0 讨论(0)
提交回复
热议问题