IIS配置跨域后非服务端访问MongoDB出现CORS请求失败问题问询
问题根因定位
你收到的CORS request did not succeed报错和普通的跨域策略拦截不同,本质是跨域请求(含预检OPTIONS请求)根本没有成功到达后端Express服务,服务器本机访问正常说明服务本身运行无问题,问题出在外部访问链路和配置上,按以下顺序排查即可:
排查步骤
检查Express服务绑定地址
绝大多数同类问题都是Express默认绑定了127.0.0.1/localhost导致,该配置下仅服务器本机可访问服务进程。修改Express监听配置,绑定到0.0.0.0允许所有网卡的请求接入:// 替换你原来的listen代码,3001替换为你实际的Express服务端口 app.listen(3001, '0.0.0.0', () => { console.log('Service running on all interfaces') })验证方式:在服务器cmd执行
netstat -ano | findstr "你的Express端口号",确认监听地址为0.0.0.0而非127.0.0.1。检查服务器端口放行规则
进入Windows防火墙的入站规则配置,新增规则放行你Express服务所用端口的TCP请求,避免外部请求被防火墙直接拦截。
验证方式:在本地机器cmd执行telnet 服务器IP 你的Express端口号,如果连接失败说明端口未放通或服务绑定错误。检查React应用API请求配置
确认你打包React应用时的API请求baseURL没有写死为localhost:端口/127.0.0.1:端口,否则本地访问网站时会请求你本地的服务而非服务器上的服务。建议将baseURL改为服务器公网IP/域名加端口,或者配置IIS反向代理将/api/*路径的请求转发到本地Express服务端口,无需对外暴露Express端口更安全。排查CORS配置冲突
不要同时在IIS和Express层面配置跨域规则,两层规则冲突会导致跨域失败。保留其中一处CORS配置即可:优先用Express的cors中间件配置,关闭IIS的CORS规则;如果用IIS反向代理,只保留IIS的CORS配置即可,同时要在反向代理规则中设置保留原始Origin请求头,避免Express拿到的Origin来源错误。
内容的提问来源于stack exchange,提问作者BrettEvade

