我的应用程序前面有一个 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 Request
Nginx 记录和返回的消息。
我正在使用 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。因此我认为您在这里误解了一些东西。