I'm serving multiple angular
apps from the same server
block in Nginx
. So in order to let the user browse directly to certain custom Angular
routes I've declared without having to go through the home page (and avoid the 404 page), I'm forwarding these routes from nginx to each angular app's index.html
, I've added a try_files
to each location
:
server {
listen 80;
server_name website.com;
# project1
location / {
alias /home/hakim/project1/dist/;
try_files $uri /index.html;
}
# project2
location /project2/ {
alias /home/hakim/project2/dist/;
try_files $uri /index.html;
}
# project3
location /project3/ {
alias /home/hakim/project3/dist/;
try_files $uri /index.html;
}
}
This solution avoids the 404 error when going to an Angular route, but the problem is that when I browse to /project2/
or /project3/
it redirects to the /project1/
. That's obviously not what is expected, since I want to have each location to forward to the /project-i/index.html
of the adequate project.
Change the first location to:
The current block matches all '/' and it's the first thing that matches the request.
Try adding to project 2:
Try the solution for multilingual Angular application AOT builds that are basically different apps - OK its the same app multiple times, build with different languages in different bundles in different directories.
Hope this helps someone
Step 1 - Build all your projects
Step 2 - Configure your nginx, note the change added in
try_files
sectionStep 3 - Reload nginx configuration
Try building you apps using --base.href=/projectx/ for example:
It is generally a bad security practice to have multiple independent apps on a single domain.
However, I believe what you're facing here is the peculiarity of the way that
try_files
works -- according to http://nginx.org/r/try_files,Effectively, this means that if there would have been an extra parameter after your
/index.html
specification (i.e., basically, anything at all), then your code would have worked as you expected; however, due to the lack of any such final parameter, what happens in each case is that everything gets redirected back to the/
location
, as if aGET /index.html HTTP/1.1
request was to have been made (except it's all done internally within nginx).So, as a solution, you can either fix the path for the internal redirect to remain within the same
location
(e.g.,/projectX/index.html
), or leave the paths alone, but make the last parameter return an error code (e.g.,=404
, which should never be triggered as long as your file always exists).E.g,
try_files $uri /projectX/index.html;
,Or,
try_files $uri /index.html =404;
.As in:
Or:
In summary, note well that
/projectX/index.html
would only work as the last parameter, and/index.html
would only work as a non-final one.