2016-12-17 25 views
0

формат журнала Nginx является:Могу ли я модифицировать встроенную переменную Nginx с помощью Lua?

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", "this is testing User-Agent") 
ngx.req.set_header("Referer", "this is testing Referer") 

и access.log изменение

127.0.0.1 [17/Dec/2016:16:21:47 +0800] "GET /test/client.php HTTP/1.1" 200 1370 "this is testing Referer" "this is testing User-Agent" "-" "-" 

Как я могу изменить встроенный var nginx как $ request? Я хочу, чтобы изменить "GET /test/client.php HTTP/1.1", прежде чем войти в Nginx access.log

ngx.var.request = "хххх" будет ошибка:

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

но Я не знаю, как это изменить с помощью ngx.req.set_header

может ли кто-нибудь сказать мне, как его изменить?

ответ

1

Вы можете изменить несколько встроенных переменных Nginx, используя Nginx Lua, но изменить модифицированную переменную запроса cannot.

На самом деле, ваше исходное предположение должно заключаться в том, что встроенные переменные не могут или, возможно, точнее, не должны быть изменены.

Всякий раз, когда вам нужна модифицированная версия встроенной переменной, определите пользовательскую переменную, внесите изменения в эту настраиваемую переменную и используйте ее вместо этого.

В вашем конкретном случае:

### 
    ### Rewrite Phase ### 
    ### 

    # Create your custom variable with a default value 
    # Runs before Log Phase so variable is available in Log Phase 
    set $changed_request "-"; 


    ### 
    ### Log Phase ### 
    ### 

    ## log_by_lua* directives (Runs before inbuilt Log Phase directives) 
    # Update the custom variable etc 
    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 
     -- Now do whatever changes you want to $changed_request. 
    }; 

    ## Inbuilt Log Phase directives 
    # Define a custom log format with your custom variable 
    log_format customlogformat '$remote_addr [$time_local] "$changed_request"' 
     ' $status $body_bytes_sent "$http_referer" "$http_user_agent" ' 
     ' "$http_x_forwarded_for" "$cookie_logintoken"'; 

    # Use your custom log format 
    access_log /path/to/access.log customlogformat; 
+0

кажется единственным способом сделать – weizhao

+0

это стоит отметить, что 'set' не действует в' htt'p контекста, вы должны использовать его в другом месте (например место). Поскольку 'log_by_lua_block' работает в фазе журнала nginx, везде, где вы используете set to define variable, должно работать. nit: нет ';' после log_by_lua_block. – cuongnv23