使用子域名访问服务器提示ERR_CONNECTION_REFUSED如何解决?
问题描述
尝试在crypto.hazim.dev上托管内容,已完成域名hazim.dev的注册,并将hazim.dev的DNS记录指向服务器IP地址,在服务器上运行命令:
python3 -m http.server --bind 0.0.0.0 80
此时访问正常。后续删除了hazim.dev的DNS记录,新增crypto.hazim.dev的解析记录,仍指向同一服务器IP,等待DNS解析生效后,运行命令:
nslookup crypto.hazim.dev
返回IP地址正确,但在浏览器地址栏输入crypto.hazim.dev访问时收到错误ERR_CONNECTION_REFUSED,直接在浏览器输入服务器IP访问则一切正常。
核心原因分析
- 最常见原因:
dev顶级域已被谷歌加入HSTS预加载列表,所有*.dev域名都会被浏览器强制要求走HTTPS协议(默认443端口),无法使用HTTP协议(80端口)访问。当前服务器仅监听了80端口的HTTP服务,未监听443端口的HTTPS服务,浏览器访问crypto.hazim.dev时会自动跳转至HTTPS的443端口,服务器无响应就会返回连接拒绝错误。而直接访问IP地址不会触发HSTS规则,所以可以正常走80端口访问。 - 其他可能原因:本地Hosts文件存在旧的域名映射记录、服务器端配置了基于Host头的访问控制规则、浏览器DNS缓存未清理。
排查解决步骤
- 第一步:验证HSTS规则影响
本地执行命令curl -v http://crypto.hazim.dev测试HTTP访问是否正常,如果能正常返回内容,再执行curl -v https://crypto.hazim.dev测试HTTPS访问,如果返回连接拒绝,即可确认是HSTS强制HTTPS导致的问题。 - 第二步:配置HTTPS服务(核心解决方法)
可通过Certbot申请免费的Let's Encrypt SSL证书,再选择两种方式部署:- 替换基础的Python HTTP服务,使用支持HTTPS的服务端启动,给Python http.server添加SSL证书参数启动即可
- 部署Nginx作为反向代理,监听443端口配置SSL证书,将请求转发到本地80端口的Python HTTP服务即可
- 第三步:其他异常场景排查
如果curl测试HTTP也无法访问,按以下步骤排查:- 检查本地Hosts文件:Windows路径为
C:\Windows\System32\drivers\etc\hosts,Linux/macOS路径为/etc/hosts,确认没有crypto.hazim.dev的旧映射记录,有则删除后重试 - 服务器端本地测试:在服务器执行
curl -v -H "Host: crypto.hazim.dev" http://127.0.0.1,如果返回正常说明服务端无Host头限制,异常则检查服务端的访问控制规则 - 清理浏览器缓存:Chrome内核浏览器可访问
chrome://net-internals/#dns清理DNS缓存后重试
- 检查本地Hosts文件:Windows路径为
内容的提问来源于stack exchange,提问作者Hazim
相关产品推荐
相关产品推荐

