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

HTTP服务器接收编码URI返回400错误,请求未达IIS问题排查

解决IIS/NodeJS拒绝含编码路径分隔符(%2F)请求的问题

核心原因

你的请求被底层HTTP驱动(IIS的HTTP.sys、NodeJS默认配置)直接拦截了——HTTP规范中,%2F是路径分隔符/的编码形式,默认会被视为潜在安全风险(比如路径遍历攻击),因此请求根本没到达应用层(IIS站点、NodeJS业务逻辑),所以IIS日志无记录、URL Rewrite规则也不生效。

解决方案

1. 针对IIS的HTTP.sys配置修改

HTTP.sys是IIS的底层HTTP处理组件,需要修改注册表允许编码的路径分隔符:

  • 打开注册表编辑器,定位到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters
  • 新建DWORD(32位)值,命名为AllowEncodedSlashes,设置值为1(允许编码的/)或2(同时允许编码的/和\)
  • 重启HTTP服务(或服务器)使设置生效:
    net stop http
    net start http
    
    注意:重启HTTP服务会中断所有依赖它的服务(如IIS、SQL Server等),建议在维护窗口操作

2. 补充IIS应用层配置

如果修改HTTP.sys后仍有问题,检查以下注册表项(确保已设置并重启IIS):

  • 定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp\Parameters
  • 确保AllowRestrictedChars和EnableNonUTF8均为DWORD值1
  • 重启IIS服务:
    iisreset
    

3. 针对NodeJS的配置调整

NodeJS默认拒绝含%2F的URL,需在创建服务器时显式开启允许选项:

const http = require('http');
// 创建服务器时添加allowEncodedSlash配置
const server = http.createServer({ allowEncodedSlash: true }, (req, res) => {
  // 此处处理业务逻辑
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Request received');
});
server.listen(3000, () => {
  console.log('Server running on port 3000');
});

安全提示

允许编码的路径分隔符会增加路径遍历攻击的风险,建议:

  • 仅在可信内部环境中启用该配置
  • 对请求路径做严格的合法性校验,限制访问范围
  • 配合IIS的Request Filtering模块,添加白名单规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:20:18