在 Nginx 中如何处理没有前导斜杠“/”的 HTTP 请求?

在 Nginx 中如何处理没有前导斜杠“/”的 HTTP 请求?

我的应用程序前面有一个 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 请求。

答案1

nginx 仅允许像下面这样的请求以不带前导的形式启动/

GET <schema>://example.com

这可以在nginx v1.20.1 ngx_http_parse.c源代码文件。HTTP 方法之后的请求行的解析从文件的第 280 行开始。

它不支持在 之后添加任意文本字符串GET。您无法使用任何规则修改此行为rewrite,因为请求验证比rewrite规则处理早得多。

我也非常确信 nginx 的实现符合 HTTP RFC。因此我认为您在这里误解了一些东西。

相关内容