在 Nginx 中从远程服务器返回带有状态代码的文件

在 Nginx 中从远程服务器返回带有状态代码的文件

我正在尝试设置我的 SPA,通过让 nginx 在响应之前对资源进行回溯检查,以返回 404 来表示无效资源。所有这些都是为了避免无效页面出现 200,从而避免蜘蛛抓取软 404 页面。

我希望的行为

Browser                           Nginx                           API
  | -- GET myapp.com/users/12 -->   |                              |
  |                                 | -- GET myapi:8000/users/12   |
  |                                 |   <----------- 404 --------  |
  | <-- 404 index.html ------------ |
  |                                 |

我希望我的配置如下所示

server {
        listen       80;
        server_name  localhost;
        root   /usr/share/nginx/html;
        index  index.html;

        location /users/ {
          # 1. Fetch from myapi:8000
          # 2. Return index.html with status from fetched URI
        }
}

我已经研究了一段时间,但还是不太清楚如何实现这一点。我见过很多简单的例子,但try_files似乎没有一个适合我的情况,因为大多数例子似乎都做了非常简单的转发。

我怎样才能实现上述行为?

答案1

我设法通过让我的后端 API 始终使用 index.html 进行响应来解决这个问题Accept: text/html。我确实尝试过使用 OpenResty 的 Lua 方式,但感觉太过黑客和古怪,并且维护起来太复杂。

然后我的配置如下所示:

    location / {
      try_files $uri $uri/ @forward_to_api;
    }

    location @forward_to_api {
      rewrite ^(.*) /api$1 break;
      proxy_set_header "Accept" "text/html";
      proxy_pass http://localhost:8000;

      # Follow any redirects
      proxy_intercept_errors on;
      error_page 301 302 307 = @follow_redirect;
    }

    location @follow_redirect {
      set $moved_location $upstream_http_location;
      proxy_pass http://localhost:8000$moved_location;
    }

这会将所有 $uri 重定向到localhost:8000/api/$uri并遵循重定向。

相关内容