OpenResty中set_by_lua添加换行符至access.log的语法问题
解决OpenResty中set_by_lua添加换行符到请求头的语法错误问题
嘿,我来帮你搞定这个问题!你遇到的unfinished string near '"'错误,根源是用了HTML实体转义的"而不是Lua识别的标准引号,再加上Nginx和Lua的双重转义规则没处理好,导致字符串一直没闭合。
错误原因拆解
你在Lua代码里写了local request_headers_all = "",但Lua根本不认识"这种HTML转义字符——它会把这一串当成字符串的一部分,自然就会认为你的字符串没写完,报出未完成的字符串错误。另外,换行符\n在Nginx配置里也需要额外转义,因为Nginx会先解析一次配置里的转义字符。
修正后的配置方案
直接把Lua代码里的"换成标准双引号,同时把换行符写成\\n(让Nginx解析后传递给Lua的是\n),就能正确生成带换行的请求头字符串了。下面是修改后的完整配置片段:
http { # 调整日志格式,让结构更清晰 log_format main ' (ra:$remote_addr) - (ru:$remote_user) (time_local:[$time_local]) (request:"$request") (status:$status) (bodybytessent:$body_bytes_sent) (http_referer:"$http_referer") (useragent:"$http_user_agent") (xforward:"$http_x_forwarded_for") (requestheaders:)$request_headers '; access_log logs/access.log main; server { listen 80; server_name localhost; location / { set_by_lua $request_headers ' local headers = ngx.req.get_headers() local header_str = "" for name, value in pairs(headers) do -- 用\\n是因为Nginx会先解析转义,Lua最终拿到的是\n(换行符) header_str = header_str .. name .. ": " .. value .. "\\n" end return header_str '; root html; index index.html index.htm; } # 其他剩余配置... } }
额外优化建议
如果你觉得双引号的转义有点麻烦,也可以用单引号来包裹Lua里的字符串,这样能减少转义的困扰:
set_by_lua $request_headers ' local headers = ngx.req.get_headers() local header_str = \'\' for name, value in pairs(headers) do header_str = header_str .. name .. \': \' .. value .. \'\\n\' end return header_str ';
这样修改后,你的access.log里的请求头就会按行展示,再也不会是连续拼接的一大串了!
内容的提问来源于stack exchange,提问作者Dave Mateer
相关产品推荐
相关产品推荐

