<span>location</span> /foo <span>{</span><span>set</span><span>$a</span><span>32</span><span>;</span><span>set</span><span>$b</span><span>56</span><span>;</span>
set_by_lua <span>$sum</span><span>'return tonumber(ngx.arg[1]) + tonumber(ngx.arg[2])'</span><span>$a</span><span>$b</span><span>;</span>
echo <span>$sum</span><span>;</span><span>}</span><span>location</span> /foo <span>{</span><span>set</span><span>$my_var</span><span>''</span><span>;</span><span><em># this line is required to create $my_var at config time</em></span>
content_by_lua <span>'
ngx.var.my_var = 123;
...
'</span><span>;</span><span>}</span> ngx.OK <span>(</span><span>0</span><span>)</span>
ngx.ERROR <span>(</span>-<span>1</span><span>)</span>
ngx.AGAIN <span>(</span>-<span>2</span><span>)</span>
ngx.DONE <span>(</span>-<span>4</span><span>)</span>
ngx.DECLINED <span>(</span>-<span>5</span><span>)</span>
ngx.HTTP_GET
ngx.HTTP_HEAD
ngx.HTTP_PUT
ngx.HTTP_POST
ngx.HTTP_DELETE
ngx.HTTP_OPTIONS (added in the v0.5.0rc24 release)
ngx.HTTP_MKCOL (added in the v0.8.2 release)
ngx.HTTP_COPY (added in the v0.8.2 release)
ngx.HTTP_MOVE (added in the v0.8.2 release)
ngx.HTTP_PROPFIND (added in the v0.8.2 release)
ngx.HTTP_PROPPATCH (added in the v0.8.2 release)
ngx.HTTP_LOCK (added in the v0.8.2 release)
ngx.HTTP_UNLOCK (added in the v0.8.2 release)
ngx.HTTP_PATCH (added in the v0.8.2 release)
ngx.HTTP_TRACE (added in the v0.8.2 release)
value <span>=</span> ngx.HTTP_OK <span>(</span><span>200</span><span>)</span>
value <span>=</span> ngx.HTTP_CREATED <span>(</span><span>201</span><span>)</span>
value <span>=</span> ngx.HTTP_SPECIAL_RESPONSE <span>(</span><span>300</span><span>)</span>
value <span>=</span> ngx.HTTP_MOVED_PERMANENTLY <span>(</span><span>301</span><span>)</span>
value <span>=</span> ngx.HTTP_MOVED_TEMPORARILY <span>(</span><span>302</span><span>)</span>
value <span>=</span> ngx.HTTP_SEE_OTHER <span>(</span><span>303</span><span>)</span>
value <span>=</span> ngx.HTTP_NOT_MODIFIED <span>(</span><span>304</span><span>)</span>
value <span>=</span> ngx.HTTP_BAD_REQUEST <span>(</span><span>400</span><span>)</span>
value <span>=</span> ngx.HTTP_UNAUTHORIZED <span>(</span><span>401</span><span>)</span>
value <span>=</span> ngx.HTTP_FORBIDDEN <span>(</span><span>403</span><span>)</span>
value <span>=</span> ngx.HTTP_NOT_FOUND <span>(</span><span>404</span><span>)</span>
value <span>=</span> ngx.HTTP_NOT_ALLOWED <span>(</span><span>405</span><span>)</span>
value <span>=</span> ngx.HTTP_GONE <span>(</span><span>410</span><span>)</span>
value <span>=</span> ngx.HTTP_INTERNAL_SERVER_ERROR <span>(</span><span>500</span><span>)</span>
value <span>=</span> ngx.HTTP_METHOD_NOT_IMPLEMENTED <span>(</span><span>501</span><span>)</span>
value <span>=</span> ngx.HTTP_SERVICE_UNAVAILABLE <span>(</span><span>503</span><span>)</span>
value <span>=</span> ngx.HTTP_GATEWAY_TIMEOUT <span>(</span><span>504</span><span>)</span><span>(</span>first added in the v0.3.1rc38 release<span>)</span>
ngx.STDERR
ngx.EMERG
ngx.ALERT
ngx.CRIT
ngx.ERR
ngx.WARN
ngx.NOTICE
ngx.INFO
ngx.DEBUG
<span>location</span> /test <span>{</span>
rewrite_by_lua <span>'
ngx.say("foo = ", ngx.ctx.foo)
ngx.ctx.foo = 76
'</span><span>;</span>
access_by_lua <span>'
ngx.ctx.foo = ngx.ctx.foo + 3
'</span><span>;</span>
content_by_lua <span>'
ngx.say(ngx.ctx.foo)
'</span><span>;</span><span>}</span> foo = nil
<span>79</span><span>location</span> /sub <span>{</span>
content_by_lua <span>'
ngx.say("sub pre: ", ngx.ctx.blah)
ngx.ctx.blah = 32
ngx.say("sub post: ", ngx.ctx.blah)
'</span><span>;</span><span>}</span>
<span>location</span> /main <span>{</span>
content_by_lua <span>'
ngx.ctx.blah = 73
ngx.say("main pre: ", ngx.ctx.blah)
local res = ngx.location.capture("/sub")
ngx.print(res.body)
ngx.say("main post: ", ngx.ctx.blah)
'</span><span>;</span><span>}</span> main pre: <span>73</span>
sub pre: nil
sub post: <span>32</span>
main post: <span>73</span> res <span>=</span> ngx.location.capture<span>(</span>uri<span>)</span>
ngx.location.capture<span>(</span><span>'/foo?a=1'</span>,
<span>{</span> args <span>=</span><span>{</span> b <span>=</span><span>3</span>, c <span>=</span><span>':'</span><span>}</span><span>}</span><span>)</span> ngx.location.capture<span>(</span><span>'/foo?a=1&b=3&c=%3a'</span><span>)</span>
<span>location</span> /sub <span>{</span>
content_by_lua <span>'
ngx.ctx.foo = "bar";
'</span><span>;</span><span>}</span><span>location</span> /lua <span>{</span>
content_by_lua <span>'
local ctx = {}
res = ngx.location.capture("/sub", { ctx = ctx })
ngx.say(ctx.foo);
ngx.say(ngx.ctx.foo);
'</span><span>;</span><span>}</span> bar
nil<span>location</span> /other <span>{</span>
content_by_lua <span>'
ngx.say("dog = ", ngx.var.dog)
ngx.say("cat = ", ngx.var.cat)
'</span><span>;</span><span>}</span>
<span>location</span> /lua <span>{</span><span>set</span><span>$dog</span><span>''</span><span>;</span><span>set</span><span>$cat</span><span>''</span><span>;</span>
content_by_lua <span>'
res = ngx.location.capture("/other",
{ vars = { dog = "hello", cat = 32 }});
ngx.print(res.body)
'</span><span>;</span><span>}</span> dog = hello
cat = 32<span>location</span> /other <span>{</span><span>set</span><span>$dog</span><span>"$dog world"</span><span>;</span>
echo <span>"$uri dog: $dog"</span><span>;</span><span>}</span>
<span>location</span> /lua <span>{</span><span>set</span><span>$dog</span><span>'hello'</span><span>;</span>
content_by_lua <span>'
res = ngx.location.capture("/other",
{ copy_all_vars = true });
ngx.print(res.body)
ngx.say(ngx.var.uri, ": ", ngx.var.dog)
'</span><span>;</span><span>}</span> /other dog: hello world
/lua: hello<span>location</span> /other <span>{</span><span>set</span><span>$dog</span><span>"$dog world"</span><span>;</span>
echo <span>"$uri dog: $dog"</span><span>;</span><span>}</span>
<span>location</span> /lua <span>{</span><span>set</span><span>$dog</span><span>'hello'</span><span>;</span>
content_by_lua <span>'
res = ngx.location.capture("/other",
{ share_all_vars = true });
ngx.print(res.body)
ngx.say(ngx.var.uri, ": ", ngx.var.dog)
'</span><span>;</span><span>}</span> /other dog: hello world
/lua: hello world res1, res2, res3 <span>=</span> ngx.location.capture_multi<span>{</span><span>{</span><span>"/foo"</span>, <span>{</span> args <span>=</span><span>"a=3&b=4"</span><span>}</span><span>}</span>,
<span>{</span><span>"/bar"</span><span>}</span>,
<span>{</span><span>"/baz"</span>, <span>{</span> method <span>=</span> ngx.HTTP_POST, body <span>=</span><span>"hello"</span><span>}</span><span>}</span>,
<span>}</span>
<span>if</span> res1.status <span>==</span> ngx.HTTP_OK <span>then</span>
...
<span>end</span>
<span>if</span> res2.body <span>==</span><span>"BLAH"</span><span>then</span>
...
<span>end</span><span><em>-- construct the requests table</em></span><span>local</span> reqs <span>=</span><span>{</span><span>}</span><span>table.insert</span><span>(</span>reqs, <span>{</span><span>"/mysql"</span><span>}</span><span>)</span><span>table.insert</span><span>(</span>reqs, <span>{</span><span>"/postgres"</span><span>}</span><span>)</span><span>table.insert</span><span>(</span>reqs, <span>{</span><span>"/redis"</span><span>}</span><span>)</span><span>table.insert</span><span>(</span>reqs, <span>{</span><span>"/memcached"</span><span>}</span><span>)</span>
<span><em>-- issue all the requests at once and wait until they all return</em></span><span>local</span> resps <span>=</span><span>{</span> ngx.location.capture_multi<span>(</span>reqs<span>)</span><span>}</span>
<span><em>-- loop over the responses table</em></span><span>for</span> i, resp <span>in</span><span>ipairs</span><span>(</span>resps<span>)</span><span>do</span><span><em>-- process the response table "resp"</em></span><span>end</span> ngx.status <span>=</span> ngx.HTTP_CREATED
status <span>=</span> ngx.status<span><em>-- equivalent to ngx.header["Content-Type"] = 'text/plain'</em></span>
ngx.header.content_type <span>=</span><span>'text/plain'</span><span>;</span>
ngx.header<span>[</span><span>"X-My-Header"</span><span>]</span><span>=</span><span>'blah blah'</span><span>;</span> ngx.header<span>[</span><span>'Set-Cookie'</span><span>]</span><span>=</span><span>{</span><span>'a=32; path=/'</span>, <span>'b=4; path=/'</span><span>}</span> Set-Cookie: <span>a</span>=<span>32</span>; <span>path</span>=<span>/</span>
Set-Cookie: <span>b</span>=<span>4</span>; <span>path</span>=<span>/</span><span>location</span> /test <span>{</span><span>set</span><span>$footer</span><span>''</span><span>;</span>
<span>proxy_pass</span><span>http</span>://some-backend<span>;</span>
header_filter_by_lua <span>'
if ngx.header["X-My-Header"] == "blah" then
ngx.var.footer = "some value"
end
'</span><span>;</span>
echo_after_body <span>$footer</span><span>;</span><span>}</span><span>local</span> h <span>=</span> ngx.resp.get_headers<span>(</span><span>)</span><span>for</span> k, v <span>in</span><span>pairs</span><span>(</span>h<span>)</span><span>do</span>
...
<span>end</span><span>local</span> request_time <span>=</span> ngx.now<span>(</span><span>)</span> - ngx.req.start_time<span>(</span><span>)</span>
ngx.<span>print</span><span>(</span>ngx.req.raw_header<span>(</span><span>)</span><span>)</span>
GET /t HTTP/1.1
Host: localhost
Connection: close
Foo: bar ngx.req.set_uri<span>(</span><span>"/foo"</span>, <span>false</span><span>)</span>
<span>rewrite</span> ^ /foo <span>break</span><span>;</span>
ngx.req.set_uri<span>(</span><span>"/foo"</span>, <span>true</span><span>)</span>
<span>rewrite</span> ^ /foo last<span>;</span>
ngx.req.set_uri_args<span>(</span><span>"a=3&b=hello%20world"</span><span>)</span>
ngx.req.set_uri_args<span>(</span><span>{</span> a <span>=</span><span>3</span>, b <span>=</span><span>"hello world"</span><span>}</span><span>)</span><span>location</span><span>=</span> /test <span>{</span>
content_by_lua <span>'
local args = ngx.req.get_uri_args()
for key, val in pairs(args) do
if type(val) == "table" then
ngx.say(key, ": ", table.concat(val, ", "))
else
ngx.say(key, ": ", val)
end
end
'</span><span>;</span><span>}</span> foo: bar
bar: baz, blah<span>location</span><span>=</span> /test <span>{</span>
content_by_lua <span>'
ngx.req.read_body()
local args, err = ngx.req.get_post_args()
if not args then
ngx.say("failed to get post args: ", err)
return
end
for key, val in pairs(args) do
if type(val) == "table" then
ngx.say(key, ": ", table.concat(val, ", "))
else
ngx.say(key, ": ", val)
end
end
'</span><span>;</span><span>}</span><span><em># Post request with the body 'foo=bar&bar=baz&bar=blah'</em></span>
$ curl <span>--data</span><span>'foo=bar&bar=baz&bar=blah'</span> localhost<span>/</span><span>test</span> foo: bar
bar: baz, blah<span>local</span> h <span>=</span> ngx.req.get_headers<span>(</span><span>)</span><span>for</span> k, v <span>in</span><span>pairs</span><span>(</span>h<span>)</span><span>do</span>
...
<span>end</span> ngx.say<span>(</span><span>"Host: "</span>, ngx.req.get_headers<span>(</span><span>)</span><span>[</span><span>"Host"</span><span>]</span><span>)</span>
ngx.req.set_header<span>(</span><span>"Content-Type"</span>, <span>"text/css"</span><span>)</span>
ngx.req.set_header<span>(</span><span>"Foo"</span>, <span>{</span><span>"a"</span>, <span>"abc"</span><span>}</span><span>)</span> ngx.req.read_body<span>(</span><span>)</span><span>local</span> args <span>=</span> ngx.req.get_post_args<span>(</span><span>)</span>
ngx.req.init_body<span>(</span><span>128</span><span>*</span><span>1024</span><span>)</span><span><em>-- buffer is 128KB</em></span><span>for</span> chunk <span>in</span> next_data_chunk<span>(</span><span>)</span><span> do</span>
ngx.req.append_body<span>(</span>chunk<span>)</span><span><em>-- each chunk can be 4KB</em></span><span>end</span>
ngx.req.finish_body<span>(</span><span>)</span> ngx.exec<span>(</span><span>'/some-location'</span><span>)</span><span>;</span>
ngx.exec<span>(</span><span>'/some-location'</span>, <span>'a=3&b=5&c=6'</span><span>)</span><span>;</span>
ngx.exec<span>(</span><span>'/some-location?a=3&b=5'</span>, <span>'c=6'</span><span>)</span><span>;</span><span>location</span> /foo <span>{</span>
content_by_lua <span>'
ngx.exec("@bar", "a=goodbye");
'</span><span>;</span><span>}</span>
<span>location</span><span>@bar</span><span>{</span>
content_by_lua <span>'
local args = ngx.req.get_uri_args()
for key, val in pairs(args) do
if key == "a" then
ngx.say(val)
end
end
'</span><span>;</span><span>}</span><span>local</span><span>table</span><span>=</span><span>{</span><span>"hello, "</span>,
<span>{</span><span>"world: "</span>, <span>true</span>, <span>" or "</span>, <span>false</span>,
<span>{</span><span>": "</span>, <span>nil</span><span>}</span><span>}</span><span>}</span>
ngx.<span>print</span><span>(</span><span>table</span><span>)</span> ngx.status <span>=</span> ngx.HTTP_GONE
ngx.say<span>(</span><span>"This is our own content"</span><span>)</span><span><em>-- to cause quit the whole request rather than the current phase handler</em></span>
ngx.<span>exit</span><span>(</span>ngx.HTTP_OK<span>)</span><span>location</span><span>=</span> /async <span>{</span><span>keepalive_timeout</span><span>0</span><span>;</span>
content_by_lua <span>'
ngx.say("got the task!")
ngx.eof() -- a descent HTTP client will close the connection at this point
-- access MySQL, PostgreSQL, Redis, Memcached, and etc here...
'</span><span>;</span><span>}</span>