Proxy

請求方法的 Nginx 代理

  • March 6, 2021

是否有可能/如何配置 Nginx 位置塊以根據請求方法(即 GET/POST)代理到不同的後端?

原因是,我目前正在處理 2 個不同 URL 的 2 種方法(一個通過 http 代理,另一個通過 fcgi)並試圖使其更加“REST”,因此理想情況下希望獲取資源以返回列表,而 POST 到同一資源應添加到列表中。

我不使用此配置,但基於此處的範例

location /service  {
 if ($request_method = POST ) {
   fastcgi_pass 127.0.0.1:1234;
 }

 if ($request_method = GET ) {
    alias /path/to/files;
 }
}

如果您編寫自己的應用程序,您還可以考慮檢查其中的 GET/POST,並發送X-Accel-Redirect標頭以將文件傳輸到 nginx。

儘管您可以使用 來實現這一點if,但 Nginx 文件通常不鼓勵這樣做,因為if它不能很好地與其他指令配合使用。例如,假設 GET 應該對所有人開放,而 POST 僅適用於經過身份驗證的使用者,使用 HTTP Basic Auth。這將需要ifauth_basic不能正常工作的 結合使用。

這是一個沒有if. 訣竅是使用“GET”和“POST”作為上游名稱的一部分,因此可以通過變數替換來解決這些問題:

http {
 upstream other_GET {
   server ...;
 }
 upstream other_POST {
   server ...;
 }
 server {
   location /service {
     proxy_pass http://other_$request_method;
   }
 }
}

要將其與除 GET 之外的所有內容的 HTTP Basic Auth 結合使用,只需添加一個limit_except塊:

 ...
   location /service {
     proxy_pass http://other_$request_method;
     limit_except GET {
       auth_basic ...;
     }
   }
 ...

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