Response headers adding/filtering during proxy with njs
Dmitry Volyntsev
xeioex at nginx.com
Tue Jan 19 19:53:10 UTC 2021
On 19.01.2021 18:44, Grzegorz Kulewski wrote:
> Hello,
>
> Is it possible to (at least) add (or better also) filter response headers (like for example setting or modifying or deleting cookies, of course without harming other cookies set by the upstream) dynamically from njs after it is returned from the upstream (or cache) and before it is sent to the client?
>
> I think something like that is possible with lua but I would really like to avoid using 3rd party modules and just go the njs route.
>
> If not possible - is there any workaround? And/or can it be easily added in next release(s)?
>
> Thank you in advance.
>
Hi Grzegorz,
Please, clarify what are you trying to do with Set-Cookie headers?
Consider built-in directives for a typical modifications like
proxy_cookie_domain, proxy_cookie_flags etc.
If nothing is applicable take a look at the following example:
nginx.conf:
js_import main from http.js;
js_set $modify_cookies main.modify_cookies;
location /modify_cookies {
add_header _ $modify_cookies;
proxy_pass http://127.0.0.1:8080;
}
server {
listen 127.0.0.1:8080;
location /modify_cookies {
add_header Set-Cookie "XXXXXX";
add_header Set-Cookie "BB";
add_header Set-Cookie "YYYYYYY";
return 200;
}
}
http.js:
function modify_cookies(r) {
var cookies = r.headersOut['Set-Cookie'];
r.headersOut['Set-Cookie'] = cookies.filter(v=>v.length >
Number(r.args.len));
return "";
}
curl http://localhost:8000/modify_cookies?len=1 -v
...
< Set-Cookie: XXXXXX
< Set-Cookie: BB
< Set-Cookie: YYYYYYY
curl http://localhost:8000/modify_cookies?len=3 -v
...
< Set-Cookie: XXXXXX
< Set-Cookie: YYYYYYY
This works because arbitrary njs code can be executed when nginx
evaluates a variable at runtime.
The trick is to find an appropriate directives which supports variables
and which is evaluated at appropriate moment of request processing. So,
in the example an auxiliary variable is used to inject njs code after an
upstream data is processed but response headers are not sent to a client
yet.
More information about the nginx
mailing list