使用Nginx从同一服务器提供多个Angular应用程序

时间:2018-01-06 10:41:32

标签: angular nginx routes

我正在为angular中的同一server块提供多个Nginx个应用。因此,为了让用户直接浏览我声明的某些自定义Angular路由而不必通过主页(并避开404页面),我将这些路由从nginx转发到每个角度应用程序index.html,我为每个try_files添加了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;
    }
}

此解决方案在转到Angular路由时避免了404错误,但问题是当我浏览到/project2//project3/时,它会重定向到/project1/。这显然不是预期的,因为我希望每个位置都转发到适当项目的/project-i/index.html

6 个答案:

答案 0 :(得分:3)

希望这对某人有帮助

第1步-构建所有项目

ng build --prod --base-href /project1/
ng build --prod --base-href /project2/
ng build --prod --base-href /project3/

第2步-配置您的nginx,请注意在try_files部分添加的更改

server {
    listen 80;
    server_name website.com;

    # project1
    location / {
        alias /home/hakim/project1/dist/;
        try_files $uri/ /project1/index.html;
    }

    # project2
    location /project2/ {
        alias /home/hakim/project2/dist/;
        try_files $uri/ /project2/index.html;
    }

    # project3
    location /project3/ {
        alias /home/hakim/project3/dist/;
        try_files $uri/ /project3/index.html;
    }
}

第3步-重新加载nginx配置

sudo service nginx reload

答案 1 :(得分:1)

在单个域上拥有多个独立应用程序通常是一种糟糕的安全措施。

但是,我相信你所面对的是try_files的工作方式的特殊性 - 根据http://nginx.org/r/try_files

  

如果未找到任何文件,则会进行内部重定向到最后一个参数中指定的uri。

实际上,这意味着如果在/index.html规范之后会有一个额外的参数(基本上就是任何东西),那么你的代码就会按预期工作;但是,由于缺少任何此类最终参数,在每种情况下会发生的情况是,所有内容都会重定向回/ location,就像发出GET /index.html HTTP/1.1请求一样(除了它都是在nginx内部完成的。)

因此,作为一种解决方案,您可以修复内部重定向的路径以保持在同一location内(例如/projectX/index.html),或者保留路径,但是创建最后一个参数返回一个错误代码(例如,=404,只要您的文件始终存在,就不应该触发它。)

  • 例如,try_files $uri /projectX/index.html;

  • 或者,try_files $uri /index.html =404;

如:

location /projectX/ {
    alias /home/projectX/dist/;
    try_files $uri /projectX/index.html; # last param is internal redirect
}

或者:

location /projectX/ {
    alias /home/projectX/dist/;
    try_files $uri /index.html =404;
}

总之,请注意/projectX/index.html仅作为最后一个参数,而/index.html仅作为非最终参数。

答案 2 :(得分:1)

尝试基本上不同的应用程序的multilingual Angular application AOT builds解决方案 - 确定多次使用相同的应用程序,使用不同语言在不同目录中的不同语言构建。

答案 3 :(得分:0)

尝试添加到项目2:

<base href="/project2">

答案 4 :(得分:0)

将第一个位置更改为:

df=["Ycor"]=df["Coordinates"].apply(lambda x: x.latitude if x != None else None)

当前区块匹配所有&#39; /&#39;它是第一个与请求相匹配的东西。

答案 5 :(得分:0)

尝试使用--base.href = / projectx /构建应用程序,例如:

ng build --base.href=/project1/
ng build --base.href=/project2/
ng build --base.href=/project3/