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服务(或服务器)使设置生效:
注意:重启HTTP服务会中断所有依赖它的服务(如IIS、SQL Server等),建议在维护窗口操作net stop http net start http
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
相关产品推荐
相关产品推荐

