Nginx 有一个非常酷的功能,就是可以通过在请求处理的各个阶段注入 Lua 脚本来控制它的行为。我成功地使用了 rewrite_by_lua/file 指令来检查传入请求的主体,并在下游 PHP 处理时注入额外的请求头信息。例如:
location /api{
rewrite_by_lua_file "/path/to/rewrite.lua";
lua_need_request_body "on";
然后在 rewrite.lua
文件中:
local uri = ngx.var.request_uri;
//examine the URI and inject additional headers
ngx.req.set_header('headerName','headerValue');
在这个阶段,我还可以注入响应头。例如:
local cookieData = "cookieName=value;path=/;";
ngx.header['Set-Cookie'] = cookieData;
目前还没有遇到任何问题,但这并不是我想要做的。 我心中的工作流程如下:
- 检查URI并注入额外的请求头。
- 我的PHP脚本检查额外的请求头,根据需要处理传入数据,并可能注入额外的响应头。
- 然后,我想在另一个Nginx Lua脚本中检查响应头并在那个阶段注入cookie。
通过我的PHP脚本注入额外的响应头根本不是问题。我认为为了检查这些额外的头,我只需要设置
location /api {
header_filter_by_lua_file "path/to/header.lua";
}
使用 header.lua
完成以下操作:
local cookieData = "cookieName=value;path=/;";
ngx.header['Set-Cookie'] = cookieData;
这个原则听起来很完美。然而,我发现我的
header_filter_by_lua_file
指令被忽略了——当我重新加载配置时,Nginx日志中没有报告任何错误。我一定是做错了什么,但我不知道可能是什么。我在Ubuntu 14.10(x64)上使用
nginx 1.6.2
,Nginx是通过apt-get install nginx-extras
安装的。如果有人能够解释如何正确地使
header_filter_by_*
工作,我将非常感激。
rewrite_by_lua_file
和ngx.
都可以很好地工作。问题出在header_by_lua...
。你是在暗示后者只能和OpenResty一起使用,而不是与** Nginx Extras**一起使用吗? - DroidOS