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

NodeJS请求PHP API返回406错误,cURL/原生JS等方式正常

排查NodeJS请求触发Mod_Security 406错误的思路

1. 精准对比请求头差异

其他客户端(cURL、浏览器)能正常请求,说明NodeJS的请求头存在Mod_Security敏感的差异:

  • 用curl -v输出完整请求头:
    curl -v --request POST --header "Content-Type:multipart/form-data" \
      --form image=@examples/sample.jpeg \
      --form projectID="xxxx" \
      -H "key:mykey" https://api.example.com/v1/api.php/image
    
  • 在NodeJS中打印实际发送的请求头:
    • Axios:添加请求拦截器打印headers
      axios.interceptors.request.use(config => {
        console.log('Request Headers:', config.headers);
        return config;
      });
      
    • Node-fetch:打印requestBody.getHeaders(),同时注意fetch自动添加的默认头(如User-Agent、Accept)
  • 重点对齐字段:将NodeJS的User-Agent、Accept、Content-Type(含multipart边界)完全匹配cURL的取值,比如强制设置User-Agent: curl/7.68.0。

2. 修复FormData文件字段的构造细节

NodeJS的FormData处理文件流时,默认不会自动添加文件名和正确的Content-Type,这可能触发Mod_Security规则:

  • 修改文件append代码,显式指定文件名和Content-Type:
    const path = require('path');
    // Axios和fetch通用
    requestBody.append('image', fs.createReadStream(image), {
      filename: path.basename(image), // 确保文件名存在
      contentType: 'image/jpeg' // 根据实际文件类型调整,如image/png
    });
    
  • 保持字段顺序和cURL一致:先appendimage,再appendprojectID,部分WAF规则会校验参数顺序。

3. 抓包对比完整请求体

用抓包工具(如Wireshark、Charles)或在API端打印完整请求内容,对比cURL和NodeJS的multipart请求体:

  • 检查multipart边界字符串的格式是否符合服务器预期
  • 检查每个字段的Content-Disposition、Content-Type属性是否完整,比如文件字段是否包含filename属性

4. 查看Mod_Security审计日志

直接查看服务器上的Mod_Security日志(通常路径为/var/log/apache2/modsec_audit.log或对应Web服务器日志目录),日志会明确记录触发的规则ID和原因,比如:

[msg "Invalid User-Agent header"] [id "900001"]
这是最直接的问题定位方式。

5. 逐步简化请求定位问题

  • 先发送无文件的请求:只传projectID和key头,若正常则问题出在文件字段处理;若仍报错则是基础请求头或参数的问题
  • 替换为小型测试文件,排除大文件或特殊内容的影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:06:18