使用nginx将PATCH请求代理到POST

时间:2015-04-17 08:06:05

标签: 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;            
        }             
    }
}

1 个答案:

答案 0 :(得分:1)

显然,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;
}

修改

如果命名位置不是一个选项,那么你总是可以使用另一个转到技巧:

location /api {
    if ($request_method = "PATCH") {
        rewrite ^/api(.*)$ /internal$1 last;
    }

    proxy_pass http://localhost:8080/api;
}

location /internal/ {
    internal;

    rewrite ^/internal/(.*)$ /$1 break;

    proxy_method POST;
    proxy_pass http://localhost:8080/api;
}

顺便说一句,在您的示例中,将/ api添加到proxy_pass没有意义,因为它与位置匹配。删除此部分不会改变请求被代理到后端的方式。