Nginx

從 Nginx 中的遠端伺服器返回帶有狀態碼的文件

  • May 22, 2020

我正在嘗試通過讓 nginx 在響應之前對資源進行回查,將我的 SPA 設置為針對無效資源返回 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等等,但似乎沒有什麼適合我的情況,因為似乎大多數例子都是非常簡單的轉發。

我怎樣才能實現上述行為?

我設法通過讓我的後端 API 始終響應 index.html 來解決這個問題Accept: text/html。我確實嘗試過使用 OpenResty 的 Lua 方式,但它感覺太 hacky 和古怪,而且維護起來太複雜。

然後我的配置如下所示:

   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並遵循重定向。

引用自:https://serverfault.com/questions/1018051