您的代码有很多问题。
“($request_body ~* (.*))”永远不会匹配其他人所说的任何内容,因此“其他情况”始终是结果
更重要的是,它使用“proxy_pass”和“if”,这在传统上是邪恶的。http://wiki.nginx.org/IfIsEvil http://wiki.nginx.org/IfIsEvil.
要获得您想要的,请使用第 3 方 ngx_lua 模块(v0.3.1rc24 及更高版本)...
location ~ \.php$ {
rewrite_by_lua '
ngx.req.read_body()
local match = ngx.re.match(ngx.var.request_body, "target")
if match then
ngx.exec("@proxy");
else
ngx.exec("@other_case");
end
';
}
location @proxy {
# test.proxy stuff
...
}
location @other_case {
# other_case stuff
...
}
你可以在以下位置获取 ngx_luahttps://github.com/chaoslawful/lua-nginx-module/tags https://github.com/chaoslawful/lua-nginx-module/tags.
附言。请记住,lua 的重写总是在 nginx 重写指令之后执行,因此如果您在其他情况下放置任何此类指令,它们将首先执行,您会得到有趣的结果。
您应该将所有重写放在 lua 上下文重写中以获得一致的结果。这就是“其他情况”的“if ..else..end”安排的原因。
您可能需要这个更长的版本
location ~ \.php$ {
rewrite_by_lua '
--request body only available for POST requests
if ngx.var.request_method == "POST"
-- Try to read in request body
ngx.req.read_body()
-- Try to load request body data to a variable
local req_body = ngx.req.get_body_data()
if not req_body then
-- If empty, try to get buffered file name
local req_body_file_name = ngx.req.get_body_file()
--[[If the file had been buffered, open it,
read contents to our variable and close]]
if req_body_file_name then
file = io.open(req_body_file_name)
req_body = file:read("*a")
file:close()
end
end
-- If we got request body data, test for our text
if req_body then
local match = ngx.re.match(req_body, "target")
if match then
-- If we got a match, redirect to @proxy
ngx.exec("@proxy")
else
-- If no match, redirect to @other_case
ngx.exec("@other_case")
end
end
else
-- Pass non "POST" requests to @other_case
ngx.exec("@other_case")
end
';
}