Windows VPS上Node.js服务器无法通过子域名访问问题求助
配置方案与排查步骤
一、Cloudflare端核心配置修正
- 修正DNS记录目标IP
你的VPS内网IP是192.168.0.12,但radio.example.net的A记录必须指向VPS的公网IP,而非内网IP。立即检查Cloudflare DNS设置,确保记录目标为VPS对外暴露的公网IP。 - 开启Cloudflare代理(橙色云朵)
在DNS记录列表中,将radio.example.net对应的云朵图标切换为橙色(代理模式)。灰色云朵仅做DNS解析,此时HTTPS请求会直接打向你的HTTP服务,浏览器会因协议不匹配拒绝连接。 - 设置SSL/TLS模式为「灵活」
进入Cloudflare「SSL/TLS」→「概述」页面,将SSL模式设为灵活。该模式下,Cloudflare与客户端用HTTPS通信,Cloudflare到你的Node.js服务(HTTP)用HTTP通信,适配当前服务无SSL证书的场景。 - 开启「始终使用HTTPS」
在「SSL/TLS」→「边缘证书」中开启该选项,确保所有访问radio.example.net的请求自动跳转到HTTPS。
二、Node.js服务优化
- 修复CORS配置冲突
你的代码中同时设置了Access-Control-Allow-Origin: *和Access-Control-Allow-Credentials: true,这两个配置无法同时生效,浏览器会抛出错误。根据需求二选一:- 若不需要身份凭据(如Cookie),删除
Access-Control-Allow-Credentials配置; - 若需要带凭据,将
Access-Control-Allow-Origin改为具体域名:res.setHeader('Access-Control-Allow-Origin', 'https://radio.example.net');
- 若不需要身份凭据(如Cookie),删除
- 明确监听所有网卡
修改server.listen参数,确保服务监听所有网卡(而非仅内网IP):server.listen(443, '0.0.0.0', () => { console.log('Server listening on port 443'); }); - 可选:升级为HTTPS服务
若想使用Cloudflare的「严格」SSL模式,可通过Cloudflare免费获取证书,改用https模块启动服务:const https = require('https'); const fs = require('fs'); const options = { key: fs.readFileSync('path/to/private.key'), cert: fs.readFileSync('path/to/certificate.crt') }; const server = https.createServer(options, app);
三、排查步骤
- 验证DNS解析:本地终端执行
nslookup radio.example.net,若返回Cloudflare节点IP,说明代理已开启;若返回VPS公网IP,说明代理未开启(需切换橙色云朵)。 - 测试源站连通性:用
curl http://[VPS公网IP]:443测试服务是否正常响应,确认服务运行且端口可访问。 - 检查Cloudflare防火墙:临时关闭WAF规则或降低安全级别,排查是否被拦截。
- 确认Windows防火墙:再次检查Windows防火墙入站规则,允许443端口的HTTP流量。
- 查看Cloudflare日志:进入「Analytics」→「Logs」,查看请求是否被拦截或返回异常状态码。
内容的提问来源于stack exchange,提问作者BleuSyn
相关产品推荐
相关产品推荐

