IIS 10配置Socket.IO反向代理失败问题排查
IIS 10反向代理配置Socket.IO时404错误解决
配置Express.js的IIS 10反向代理后,Socket.IO请求返回404错误,响应提示Cannot GET /Rejected-By-UrlScan。当前使用的反向代理规则如下:
<rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="http://localhost:7000/{R:1}" /> </rule>
问题原因
这个错误是IIS的UrlScan模块拦截了Socket.IO请求导致的。Socket.IO的请求路径包含特殊格式(比如/socket.io/?EIO=4&transport=polling&t=...),UrlScan默认规则会限制这类带特殊查询参数或路径格式的请求。
解决步骤
- 修改UrlScan配置文件(默认路径
C:\Windows\System32\inetsrv\urlscan\UrlScan.ini):- 找到
AllowVerbs项,确保GET、POST、OPTIONS都在允许列表内(Socket.IO依赖这些请求方法) - 找到
AllowQueryString项,设置为1以允许查询字符串 - 找到
DenyUrlSequences项,移除可能拦截Socket.IO路径的规则(比如含?、=的限制)
- 找到
- 调整IIS反向代理规则,确保Socket.IO路径被正确转发,可新增专门的匹配规则:
<rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="http://localhost:7000/{R:1}" /> </rule> <rule name="SocketIORewrite" stopProcessing="true"> <match url="^socket.io/(.*)" /> <action type="Rewrite" url="http://localhost:7000/socket.io/{R:1}" /> </rule>
- 重启IIS服务,让配置生效
- 检查Express端Socket.IO配置,确保允许跨域(若前后端域名不同):
const io = require('socket.io')(server, { cors: { origin: "你的前端域名或*", methods: ["GET", "POST"] } });
内容的提问来源于stack exchange,提问作者Ariff Naj
相关产品推荐
相关产品推荐

