使用 nginx 将 PATCH 请求代理到 POST
Proxying PATCH request to POST with nginx
我尝试使用 nginx 将 HTTP PATCH 请求重定向到 HTTP POST 请求。
我也尝试了以下配置,但它不起作用(我收到 400 错误请求):
http {
map $request_method $my_method {
default $request_method;
PATCH "POST";
}
server {
location /api {
proxy_method $my_method;
proxy_pass http://localhost:8080/api;
}
}
}
显然,指令“proxy_method $my_method
”不起作用。也许我的地图指令不对,但我真的不明白为什么。
我也尝试像下面的例子那样设置一个变量,但结果相同
HTTP {
server {
location /api {
set $my_method $request_method;
if($request_method = PATCH){
set $my_method POST;
}
proxy_method $my_method;
proxy_pass http://localhost:8080/api;
}
}
}
显然,proxy_method 目前无法使用变量。您可以尝试改用古老的 goto 技巧:
location / {
error_page 418 = @patch;
if ($request_method = "PATCH") {
return 418;
}
proxy_pass http://localhost:8080;
}
location @patch {
proxy_method POST;
proxy_pass http://localhost:8080;
}
编辑:
如果命名位置不是一个选项,那么您总是可以使用另一个 goto 技巧:
location /api {
if ($request_method = "PATCH") {
rewrite ^/api(.*)$ /internal last;
}
proxy_pass http://localhost:8080/api;
}
location /internal/ {
internal;
rewrite ^/internal/(.*)$ / break;
proxy_method POST;
proxy_pass http://localhost:8080/api;
}
顺便说一句,在您的示例中,将 /api 添加到 proxy_pass 没有意义,因为它与位置匹配。删除这部分不会改变请求代理到后端的方式。
我尝试使用 nginx 将 HTTP PATCH 请求重定向到 HTTP POST 请求。
我也尝试了以下配置,但它不起作用(我收到 400 错误请求):
http {
map $request_method $my_method {
default $request_method;
PATCH "POST";
}
server {
location /api {
proxy_method $my_method;
proxy_pass http://localhost:8080/api;
}
}
}
显然,指令“proxy_method $my_method
”不起作用。也许我的地图指令不对,但我真的不明白为什么。
我也尝试像下面的例子那样设置一个变量,但结果相同 HTTP {
server {
location /api {
set $my_method $request_method;
if($request_method = PATCH){
set $my_method POST;
}
proxy_method $my_method;
proxy_pass http://localhost:8080/api;
}
}
}
显然,proxy_method 目前无法使用变量。您可以尝试改用古老的 goto 技巧:
location / {
error_page 418 = @patch;
if ($request_method = "PATCH") {
return 418;
}
proxy_pass http://localhost:8080;
}
location @patch {
proxy_method POST;
proxy_pass http://localhost:8080;
}
编辑:
如果命名位置不是一个选项,那么您总是可以使用另一个 goto 技巧:
location /api {
if ($request_method = "PATCH") {
rewrite ^/api(.*)$ /internal last;
}
proxy_pass http://localhost:8080/api;
}
location /internal/ {
internal;
rewrite ^/internal/(.*)$ / break;
proxy_method POST;
proxy_pass http://localhost:8080/api;
}
顺便说一句,在您的示例中,将 /api 添加到 proxy_pass 没有意义,因为它与位置匹配。删除这部分不会改变请求代理到后端的方式。