使用 nginx 将请求从 POST 重写为 GET

使用 nginx 将请求从 POST 重写为 GET

我有一个后端服务器,由于各种原因,它只处理 GET 请求。此服务器位于 nginx 代理后面(即所有访问都通过 nginx 进行,然后 nginx 使用 将其代理到后端proxy_pass)。是否可以让 nginx 将 POST 请求重写为 GET 请求,即,这样POST /foo带有正文内容类型application/x-www-form-urlencoded和正文的请求foo=bar将被代理到GET /foo?foo=bar

答案1

这个小例子适用于我使用 ubuntu 16.04 上的 nginx 1.10.x 和 nginx-extras (包含 lua) 的情况。它不尊重请求中的查询参数,而是将它们与帖子主体合并。

server {
    ...
    server_name ...;

    client_max_body_size 4k; # prevent too long post bodies

    location / {
            if ($request_method = POST ) {
                access_by_lua '
                        ngx.req.read_body()
                        local data = ngx.req.get_body_data()
                        ngx.req.set_uri_args(data)
                ';                
            }

            proxy_pass http://yourupstreamdestination;
            proxy_method GET;                    # change method
            include /etc/nginx/proxy_params.inc; # include some params
    }
}

答案2

改进Falk Nisius 的原始答案,但没有警告:

它不尊重来自请求的查询参数,而是将它们与帖子主体合并。

您可以切换到使用get_post_args而不是get_body_data,它返回一个表而不是字符串。

set_uri_args可以采用字符串或表,因此在这种情况下,您可以将它与中的表结合起来get_post_args

合并这两个表将获得所有参数,例如:

server {
    ...
    server_name ...;

    client_max_body_size 4k; # prevent too long post bodies

    location / {
            if ($request_method = POST ) {
                access_by_lua '
                        ngx.req.read_body()

                        local post_data = ngx.req.get_post_args()
                        local get_data = ngx.req.get_uri_args()
                        for k,v in pairs(get_data) do post_data[k] = v end

                        ngx.req.set_uri_args(post_data)
                ';                
            }

            proxy_pass http://yourupstreamdestination;
            proxy_method GET;                    # change method
            include /etc/nginx/proxy_params.inc; # include some params
    }
}

相关内容