openresty用header_filter_by_lua设置自定义HTTP头,



header_filter_by_lua的说明:

header_filter_by_lua

syntax: header_filter_by_lua <lua-script-str>

context: http, server, location, location if

phase: output-header-filter

WARNING Since the v0.9.17 release, use of this directive is discouraged; use the new header_filter_by_lua_block directive instead.

Uses Lua code specified in <lua-script-str> to define an output header filter.

Note that the following API functions are currently disabled within this context:

Output API functions (e.g., ngx.say and ngx.send_headers)
Control API functions (e.g., ngx.redirect and ngx.exec)
Subrequest API functions (e.g., ngx.location.capture and ngx.location.capture_multi)
Cosocket API functions (e.g., ngx.socket.tcp and ngx.req.socket).
Here is an example of overriding a response header (or adding one if absent) in our Lua header filter:

 location / {
     proxy_pass http://mybackend;
     header_filter_by_lua 'ngx.header.Foo = "blah"';
 }
This directive was first introduced in the v0.2.1rc20 release.


官网:https://github.com/openresty/lua-nginx-module#header_filter_by_lua


作用:

a)新增自定义的HTTP头

b)重新设置upstream返回的HTTP头,也就是起到覆盖作用


使用示范源码:nginx.conf

worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}

http {

    log_format  main  '$msec $status $request $request_time '
                      '$http_referer $remote_addr [ $time_local ] '
                      '$upstream_response_time $host $bytes_sent '
                      '$request_length $upstream_addr';

    access_log  logs/access.log main buffer=32k flush=1s;

    upstream remote_world {
        server 127.0.0.1:8080;
    }

    server {
        listen 80;

        location /exec {
            content_by_lua '
                local cjson = require "cjson"
                local headers = {
                    ["Etag"] = "663b92165e216225df78fbbd47c9c5ba",
                    ["Last-Modified"] = "Fri, 12 May 2016 18:53:33 GMT",
                }
                ngx.var.my_headers = cjson.encode(headers)
                ngx.var.my_upstream = "remote_world"
                ngx.var.my_uri = "/world"
                ngx.exec("/upstream")
            ';
        }

        location /upstream {
            internal;

            set $my_headers $my_headers;
            set $my_upstream $my_upstream;
            set $my_uri $my_uri;
            proxy_pass http://$my_upstream$my_uri;

            header_filter_by_lua '
                local cjson = require "cjson"
                headers = cjson.decode(ngx.var.my_headers)
                for k, v in pairs(headers) do
                    ngx.header[k] = v
                end
            ';
        }
    }


    server {
        listen 8080;

        location /world {
            echo "hello world";
        }
    }
}

运行:openresty -p `pwd` -c conf/nginx.conf


运行结果:



原文出自:http://blog.csdn.net/daiyudong2020/article/details/53149242


End;

相关内容

    暂无相关文章