当前位置: 首页 > 知识库问答 >
问题:

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

顾高翰
2023-03-14

我在Nginx中为来自同一服务器的多个angular应用提供服务。因此,为了让用户直接浏览到我声明的某些自定义Angular路由,而不必通过主页(避免404页面),我将这些路由从nginx转发到每个Angular应用程序的索引。html,我在每个位置添加了一个try\u文件

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;
    }
}

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


共有3个答案

魏学智
2023-03-14

尝试多语言角度应用程序AOT构建的解决方案,这些构建基本上是不同的应用程序-好的,多次使用相同的应用程序,在不同的目录中的不同捆绑包中使用不同的语言构建。

沈曜灿
2023-03-14

在一个域上有多个独立的应用程序通常是一种糟糕的安全做法。

然而,我相信你在这里面临的是try_files工作方式的特殊性——根据http://nginx.org/r/try_files,

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

实际上,这意味着如果在/索引之后有一个额外的参数。html规范(即,基本上是任何东西),那么您的代码就会按照预期工作;但是,由于缺少任何这样的最终参数,在每种情况下都会将所有内容重定向回/位置,就像获取/索引一样。html HTTP/1.1请求应该已经发出(除了它都是在nginx内部完成的)。

因此,作为一种解决方案,您可以修复内部重定向的路径,使其保持在相同的位置(例如,/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;
    }
    

    总之,请注意,/project ectX/index.html只能作为最后一个参数工作,而/index.html只能作为非最终参数工作。

  • 刘俊语
    2023-03-14

    希望这对别人有帮助

    步骤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
    
     类似资料:
    • 当我需要App1的说明时,我的服务器用键1调用google api,当我需要App2的说明时,我的服务器用键2调用google api,当我需要App3的说明时,我的服务器用键3调用google api 所以我的服务器就像一个API网格一样工作。这违反谷歌条款吗?我担心他们会查看服务器的ip地址,看到有3个密钥使用,并假设我对相同的应用程序使用不同的密钥,这是被禁止的。

    • 我有以下文件夹结构为我的应用程序 这是我的nginx.conf 这就是我一直犯的错误 页面显示正确,我只是可以在子文件夹中到达api资源。你能帮我找出我做错了什么吗?如果您需要任何额外的信息,请让我知道,我会提供 非常感谢。

    • 我需要一个关于如何使用Google-guice为服务的多个实现编写代码的建议。下面是示例 因为Guice不允许将一个类型绑定到多个实现,因为下面的代码会导致错误 我们可以用下面的命名注释来解决这个问题 但我工作的应用程序是这样的。我们在init()方法中绑定所有模块并创建注入器模块: 但是通过上述过程,我可以将一个实现类绑定到接口(服务类) 你能给我提供一个方法来与供应商合作吗。我想在下面这样做

    • 多个同步服务器 Since you have full control of express instance lifecycle, it's not a problem to create a few multiple simultaneous servers (e.g. both HTTP & HTTPS). Example: 因为你已经可以完全控制express实例的生命周期了,所以创建多个

    • 什么是 SSL? SSL(安全套接层,Secure Sockets Layer),及其继任者 TLS (传输层安全,Transport Layer Security)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 会在传输层对网络连接进行加密。 通过 SSL 加密,网站与用户之间的数据交互会更加安全,能够避免大多数的网络窃听问题。通常在登录以及涉及交易等安全要求比较高的情况下,

    • 简介 服务提供器是所有 Laravel 应用程序引导中心。你的应用程序以及 Laravel 的所有核心服务都是通过服务提供器进行引导。 在这里,我们说的「引导」其实是指 注册 ,比如注册服务容器绑定、事件监听器、中间件,甚至是路由的注册。服务提供器是配置你的应用程序的中心。 Laravel 的 config/app.php 文件中有一个 providers 数组。数组中的内容是应用程序要加载的所有