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

NGINX njs模块中r.requestBody等属性返回undefined问题求助

解决NGINX njs无法读取requestBody/requestText的问题

问题根源

NGINX njs不会自动将请求体加载到r.requestBody、r.requestText或r.requestBuffer属性中,这些属性仅在请求体被主动读取后才会有值。另外,GET请求本身没有请求体,因此这类请求下这些属性必然返回undefined。

解决方案

要读取请求体,必须通过异步事件监听的方式处理(因为请求体是流式传输的),以下是修改后的WAF代码示例:

修改后的waf.js

async function main(r) {
    // 异步读取请求体
    const requestBody = await new Promise((resolve) => {
        const chunks = [];
        // 接收请求体片段
        r.on('request', (chunk) => chunks.push(chunk));
        // 请求体读取完成
        r.on('eof', () => resolve(Buffer.concat(chunks).toString()));
        // 请求中断时返回空字符串
        r.on('abort', () => resolve(''));
    });

    // WAF拦截逻辑示例
    if (requestBody.includes('malicious_content')) {
        // 返回拦截页面
        r.return(403, r.fs.readFileSync('/usr/share/nginx/html/block.html'));
    } else {
        // 转发到后端服务
        r.internalRedirect('@app-backend');
    }
}

export default { main };

配置注意事项

  1. 测试时请使用POST请求(GET请求无请求体),例如用curl测试:
    curl -X POST -d "test=hello&key=value" http://localhost
    
  2. 确保NGINX配置中允许处理请求体,默认配置已包含client_body_buffer_size等必要参数,无需额外修改。
  3. 如果需要处理大请求体,可调整client_max_body_size参数(例如client_max_body_size 10m;)避免请求被拒绝。

验证方式

修改代码后重启NGINX:

nginx -s reload

发送POST请求后,即可在WAF逻辑中正常获取请求体内容,根据判断结果转发或拦截请求。

内容的提问来源于stack exchange,提问作者NO_NAME

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:40:28