在proxy_pass之后,NGINX是否可以更改响应代码?

0sgqnhkj  于 2023-01-16  发布在  Nginx
关注(0)|答案(2)|浏览(189)

我有一个命名空间为/api/的内部API服务器,我想使用proxy_pass将所有其他请求传递到Amazon S3静态站点。这一切都很好,只是因为Amazon提供的是单页面应用程序,所以我想总是返回相同的HTML文件。我在S3服务器上是这样做的,将索引和错误页设置为同一个文件。表面上看起来一切正常,但是对于/之外的所有其他请求,S3示例返回404。在将其返回给客户端之前,我可以使用NGINX将其更改为200吗?

server {
  listen 80;
  server_name example.com;

  location /api/ {
    # serve internal app
  }

  location / {
    proxy_pass http://example.amazonaws.com/;
    # ALWAYS RETURN A 200
  }
}
g9icjywg

g9icjywg1#

你应该能够使用error_page和proxy_intercept_errors指令来实现这个目标,类似这样的东西应该可以。

location / {
    proxy_pass http://example.amazonaws.com/;
    proxy_intercept_errors on;
    error_page 404 =302 /your_html_file
}
  • 错误页面
  • 代理拦截错误
bwntbbo3

bwntbbo32#

您可以在内部重写所有指向您要提供的文档的URL。这避免了错误处理循环和有问题的重定向。
它可能是这样的(未经测试):

location / {
    proxy_pass http://example.amazonaws.com/;
    rewrite ^.* /index.html
}

请注意,您可能希望在文档中只使用完整URL或根相对URL,因为您不知道文档是否是从子目录提供的。
你也应该明智地使用JS代码来验证URL,并选择性地重定向到一个你认为有效的URL,否则第三方网站可能会链接到攻击性的URL,并将其放入搜索索引中!

相关问题