You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:52:30