Hosts文件自定义子域名生效但自定义域名无法访问问题求助
问题排查与解决方案
1. 优先确认访问方式是否正确
HTTP协议默认访问80端口,HTTPS默认访问443端口,你的本地开发服务运行在8000端口,因此访问非默认端口的服务必须显式追加端口号:
- 正确访问地址:
http://mytenantsdomain.com:8000、http://testtenant.com:8000 - 若直接输入域名不加
:8000,会默认访问80端口,而你本地80端口没有运行服务,自然会返回ERR_CONNECTION_REFUSED报错,和hosts配置本身无关。
2. 确认hosts配置生效
如果已经加了端口还是无法访问,先验证hosts解析是否正常:
- 打开终端执行命令:
ping mytenantsdomain.com,看返回的IP是否为127.0.0.1 - 如果返回IP不对,检查hosts文件的权限与格式:
- 执行
sudo chmod 644 /etc/hosts、sudo chown root:wheel /etc/hosts修正文件权限 - 确认hosts文件每行没有多余的隐藏字符、域名和IP之间用空格分隔,修改完成后再执行你之前的DNS刷新命令即可。
- 执行
3. 检查开发服务的域名校验配置
如果hosts解析正常、端口也加了还是报错,大概率是你的多租户应用做了域名白名单限制:
- 比如Django框架的
ALLOWED_HOSTS配置、Node.js多租户中间件的域名校验规则,需要把mytenantsdomain.com、testtenant.com加到允许的域名列表中,否则服务会直接拒绝来自未备案域名的请求。 - 同时确认服务是绑定在
0.0.0.0或者127.0.0.1上,没有限制仅接收*.localhost后缀的请求。
4. 免加端口访问的优化方案
如果你不想每次访问都手动加:8000,可以用本地Nginx做反向代理:
- 用Homebrew安装Nginx:
brew install nginx - 在Nginx配置中新增如下规则:
server { listen 80; server_name *.localhost mytenantsdomain.com testtenant.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
- 执行
sudo nginx -s reload重载配置,之后直接访问域名即可,不需要再加端口号。
5. 浏览器缓存排查
如果以上配置都正确还是报错,可以用浏览器无痕模式测试,或者清空浏览器的DNS缓存、访问历史缓存,避免之前的错误访问记录干扰测试。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

