我有一个后端服务器,由于各种原因,它只处理 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
}
}