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 };
配置注意事项
- 测试时请使用POST请求(GET请求无请求体),例如用curl测试:
curl -X POST -d "test=hello&key=value" http://localhost - 确保NGINX配置中允许处理请求体,默认配置已包含
client_body_buffer_size等必要参数,无需额外修改。 - 如果需要处理大请求体,可调整
client_max_body_size参数(例如client_max_body_size 10m;)避免请求被拒绝。
验证方式
修改代码后重启NGINX:
nginx -s reload
发送POST请求后,即可在WAF逻辑中正常获取请求体内容,根据判断结果转发或拦截请求。
内容的提问来源于stack exchange,提问作者NO_NAME
相关产品推荐
相关产品推荐

