Nginx
在 Nginx 中如何處理沒有前導斜杠“/”的 HTTP 請求?
我的應用程序前面有一個 Nginx 代理。我最近了解到,HTTP 請求也可以在沒有前導斜杠的情況下發出。
例如:
POST acme/_search HTTP/1.1
在這種情況下,Nginx 總是返回
400 Bad Request
. 我想通過修改 request_uri 或用前導斜杠重寫請求路徑來處理這種情況。這樣 request_uri
acme/_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 Request
Nginx 記錄並返回的消息。我正在使用 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。因此,我認為您在這裡誤解了一些東西。