如果远程路径不存在,则通过 proxy_pass 提供特定远程路径

如果远程路径不存在,则通过 proxy_pass 提供特定远程路径

我已经花了将近半天的时间来解决这个问题。:(

在我笔记本电脑上运行的 Nginx 上,我没有使用 proxy_pass,尝试文件运行良好。我编写的 Javascript Web 应用程序在页面加载时进行客户端路由。但是,如果刷新网页,则服务器会接收请求。

我在笔记本电脑上运行的 Nginx 中有此配置

location /viewer {
  try_files $uri /viewer/index.html;
}

使用上面的配置,如果我请求http://localhost/viewer/getservice在我的文件系统中不存在,我将使用 /viewer/index.html 来访问。效果非常好!

然而,我们在工作中采用了不同的配置。我们所有的静态文件/html 页面都存储在上游 S3 存储桶中。

这是我们的工作配置

location /viewer {
  proxy_pass http://s3-bucket-server/viewer;
  add_header 'Access-Control-Allow-Credentials' 'true';
  add_header 'Access-Control-Allow-Origin' $cors_header;
  add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
  add_header 'Access-Control-Allow-Headers' 'DNT,Keep-Alive,User-Agent,Origin,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

当我像这样访问时,上面的配置工作得很好http://internal-app.docs.svr/viewer。我可以点击左侧导航,将客户端的位置路径更改为

http://internal-app.docs.svr/viewer/settings
http://internal-app.docs.svr/viewer/docs
http://internal-app.docs.svr/viewer/permissions
etc

但是,如果我进入http://internal-app.docs.svr/viewer/permissions并点击了浏览器,通常会发生的情况是,它会在我们的 Web 服务器 internal-app.docs.svr 上对 /viewer/permissions 执行 GET 调用。不幸的是,没有 nginx 位置规则可以处理这种情况。

我想要实现的是,当上述情况发生时(404),让 nginx 提供 /viewer/index.html。我不想重定向,因为我想保留我上次所在的路径。在本例中,它是/viewer/permissions。我编写的 javascript 应用程序最终会处理/viewer/permissions

答案1

我终于使用下面的配置让它工作了

error_page 404 @proxy;

然后

location @proxy {
  rewrite ^ /viewer/index.html break;
  proxy_pass http://s3-bucket-server;
}

相关内容