我可以用Lua修改内置的Nginx变量吗?

nginx的日志格式为:

log_format  main  '$remote_addr [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$cookie_logintoken"';

我通过log_by_lua_file设置日志

log_by_lua_file xxxxx/ngx_lua_waf/log.lua;

并且log.lua的内容为:

ngx.req.set_header("User-Agent", "这是测试User-Agent")
ngx.req.set_header("Referer", "这是测试Referer")

然后access.log变成了

127.0.0.1 [17/Dec/2016:16:21:47 +0800] "GET /test/client.php HTTP/1.1" 200 1370 "这是测试Referer" "这是测试User-Agent" "-" "-"

我该如何改变类似 $request 这样的nginx内置变量?我想在nginx记录到access.log之前改变"GET /test/client.php HTTP/1.1"

ngx.var.request = "xxxx"将会出错:

failed to run log_by_lua*: xxxx/ngx_lua_waf/log.lua:15: variable "request" not changeable

但是我不知道如何使用ngx.req.set_header来改变它

有人可以告诉我如何改变它吗?

点赞
用户891636
用户891636

你可以使用 Nginx Lua 修改几个嵌入式 Nginx 变量,但不能修改嵌入请求变量。

实际上,你的起点假设应该是内嵌变量不能,或者更准确地说,不应该被修改。

每当你需要一个修改后的内嵌变量版本时,定义一个自定义变量,对该自定义变量进行更改,然后使用它。

对于你的特定情况:

    ###
    ### 重写阶段 ###
    ###

    # 使用默认值创建你的自定义变量
    # 在日志阶段之前运行,因此变量在日志阶段中可用
    set $changed_request "-";

    ###
    ### 日志阶段 ###
    ###

    ## log_by_lua* 指令(在内置日志阶段指令之前运行)
    # 更新自定义变量等
    log_by_lua_block {
        ngx.req.set_header("User-Agent", "this is testing User-Agent")
        ngx.req.set_header("Referer", "this is testing Referer")

        ngx.var.changed_request = ngx.var.request
        --现在对你想要修改的 $changed_request 进行任何更改。
    };

    ## 内置日志阶段指令
    # 定义具有自定义变量的自定义日志格式
    log_format  customlogformat  '$remote_addr [$time_local] "$changed_request"'
        ' $status $body_bytes_sent "$http_referer" "$http_user_agent" '
        ' "$http_x_forwarded_for" "$cookie_logintoken"';

    # 使用你的自定义日志格式
    access_log /path/to/access.log customlogformat;
2016-12-17 09:48:12