Nginx

在 Nginx 中如何處理沒有前導斜杠“/”的 HTTP 請求?

  • May 29, 2021

我的應用程序前面有一個 Nginx 代理。我最近了解到,HTTP 請求也可以在沒有前導斜杠的情況下發出。

例如:

POST acme/_search HTTP/1.1

在這種情況下,Nginx 總是返回400 Bad Request. 我想通過修改 request_uri 或用前導斜杠重寫請求路徑來處理這種情況。

這樣 request_uriacme/_search將被重寫為/acme/_search. 任何帶有前導斜杠的請求都可以正常工作並返回200

我嘗試使用伺服器塊中的重寫語句來處理它,如下所示:

server {
   listen 9000;

   if ($request_uri ~* ^[^\/]) {
     rewrite ^(.*)$ /$1 break;
   }

   location / {
       proxy_pass http://upstream_http;
       allow all;
   }
}

^ 我在上面的塊中嘗試做的是,檢查是否request_uri不以前導斜杠開頭,如果是,則用前導斜杠重寫路徑。

但是這種配置不起作用。我仍然收到400 Bad RequestNginx 記錄並返回的消息。

我正在使用 telnet 來發出範例請求:

telnet localhost 9000

POST acme/_search HTTP/1.1

想知道如何使用 Nginx 作為代理來處理這些沒有前導斜杠的 HTTP 請求。

nginx 只允許像下面這樣的請求在沒有前導的情況下啟動/

GET <schema>://example.com

這可以在nginx v1.20.1 ngx_http_parse.c原始碼文件中看到。HTTP 方法之後的請求行的解析從文件中的第 280 行開始。

它不支持 . 之後的任意文本字元串GET。您不能使用任何rewrite規則修改此行為,因為請求驗證比rewrite規則處理要早得多。

我也非常有信心 nginx 的實現符合 HTTP RFC。因此,我認為您在這裡誤解了一些東西。

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