我正在开发一个 nginx s3 反向代理容器映像,以在 Application Load Balancer 后面代理来自 s3 的前端文件(Angular 应用程序)。前端文件位于 s3 存储桶中给定应用程序名称的特定文件夹中。这些是使用标准角度命令构建的角度应用程序。 dist 内容被上传到 s3,然后是 ALB 路由路径,以及 nginx 位置映射到 s3 中的那些应用程序文件夹。例如,这是我的 nginx conf 文件:
server {
listen 80;
listen 443 ssl;
ssl_certificate /etc/ssl/nginx-server.crt;
ssl_certificate_key /etc/ssl/nginx-server.key;
server_name timemachine.com;
sendfile on;
default_type application/octet-stream;
resolver 8.8.8.8;
server_tokens off;
location ~ ^/app1/(.*) {
proxy_http_version 1.1;
proxy_buffering off;
proxy_ignore_headers "Set-Cookie";
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header x-amz-meta-s3cmd-attrs;
proxy_hide_header Set-Cookie;
proxy_set_header Authorization "";
proxy_intercept_errors on;
rewrite ^/app1/?$ /app1/index.html;
proxy_pass https://<s3 bucket name here>;
break;
}
}
所以在 s3 中有一个相应的存储桶文件夹 /app1,它具有 dist 内容并正在提供 index.html。在 ALB 上,有两条路由路径。第一个是 /app1 重定向到 https:{port}//app1/ 然后第二个路由路径 /app1/* 只是转发到通过 ECS Fargate 部署的 nginx 反向代理容器。
这不是使用云端。该存储桶在 https 上进行内部代理,并且在该存储桶上设置了特定权限,以便可以在给定的 VPC 中访问。
角度应用程序有特定的模块,但问题是因为我没有在容器中保存任何这些内容,我不能只做一个 try_files,或设置一个索引来完成这项工作,因为所有这些都是从 s3 代理的并且内容的访问方式不同。
我可以使用上面给定的代理配置访问应用程序,但对于其他路径,比如当我导航到应用程序的 /app1/account 所在的部分然后进行刷新时,页面会抛出对存储桶的访问被拒绝我只是在浏览器中获得标准的 xml 页面。
我如何让它与所有其他相对路径一起工作而不必将这些路径中的每一个添加到 nginx 或 ALB 路由?换句话说,我不想添加
location /app1/account {
}
等等,或类似的东西。是的,我对 nginx 有点陌生,所以我还在想办法。我期待上面的代理与 /app1 上的所有路径一起工作,但我不确定需要将哪些其他路由路径添加到 ALB 或者正则表达式是否关闭,或者还需要将什么添加到 nginx conf 文件中。
就是说,当我进入这个
https://timemachine.com/app1
或者这个,
https://timemachine.com/app1/
两者都有效,只需重写 index.html 即可。在此之后,当我单击 UI 中指向 /app1/ 上另一条路径的另一个图标时,我被正确定向到页面...
https://timemachine.com/app1/news
但是然后在这条路径上刷新,而不是点击 url https://timemachine.com/app1/news
,当我通过 UI 访问它时显示所有数据,url 保持在
https://timemachine.com/app1/news
但页面默认为 s3 bucket access denied on that route( .xml).目标只是能够在我已经可以访问的页面上重新加载,而不会导致 UI 崩溃并默认显示拒绝访问消息。所以我希望能够只输入
https://timemachine.com/app1/news
,这将显示内容,然后刷新并再次查看内容。角度应用程序中有各种模块,因此这些是相对路径,这可能是问题的一部分。