SSF0SSF0
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
  • Bash

    • Bash 获取路径在不同类型电脑的区别
  • Git

    • Git 使用 ssh 与 https 的区别
    • Git 回滚、重置与变基
    • 文件名大小写发生变化的坑
    • Git 提交信息规范解读与实践指南
    • Git 历史邮箱统一 + 推送 GitHub 后的远程分支处理指南
  • Docker

    • Docker 命令大全
    • nginx 镜像部署静态文件
    • Docker 运行命令说明
    • 使用 node 镜像运行本地项目
    • 挂载和卷的区别
    • Docker 打包多平台镜像
    • Docker 使用 mysql
    • Docker 容器网络访问问题总结
    • 为什么 Docker 容器内运行服务必须使用 0.0.0.0 绑定服务?
  • VuePress

    • 使用 VuePress 搭建个人博客概括
  • CI/CD

    • blog 使用 Github-Actions 部署 docker 服务器
  • 服务器

    • 腾讯云使用 ssh 连接服务器(Linux 实例)
    • ssl 证书安装到 docker 服务器
    • 操作系统与架构
    • ssh 连接时长问题
  • 掌握 hosts 文件:本地开发、域名重定向与回调处理完全指南
  • Cloudflare DNS与代理:完全指南

掌握 hosts 文件:本地开发、域名重定向与回调处理完全指南

什么是 hosts 文件

hosts 文件是操作系统中的一个文本文件,用于将域名映射到指定的 IP 地址。在没有 DNS 服务器的情况下,操作系统会首先查找该文件来解析域名。它通常位于以下路径:

  • Windows: C:\Windows\System32\drivers\etc\hosts

  • Linux/macOS: /etc/hosts

hosts 文件的基本语法

IP地址        域名

每一行将一个 IP 地址映射到一个或多个域名,多个域名之间用空格或制表符分隔。

重要限制说明

  1. hosts 文件只能映射域名到 IP,不能配置以下情况:

    • 不能在 IP 地址后添加端口号

    • 不能在域名后添加端口号

    • 不能处理 URL 的路径部分

    • 不能处理协议(http/https)

  2. 浏览器访问域名时的特殊情况:

    • 很多浏览器会自动将输入的域名重定向到 www 开头的版本

    • 例如:输入 example.com 可能会被重定向到 www.example.com

    • 因此配置 hosts 时,建议同时配置带 www 和不带 www 的版本

例如,如果配置了:

127.0.0.1    adblock.com

当打开的地址是 https://adblock.com:1000 时可能无法正确解析到本地,原因有:

  • hosts 无法处理 https 协议(https 协议需要证书)

  • 缺少 www 开头的配置

  • 电脑或浏览器配置了代理

正确访问方式:访问 http://www.adblock.com:1000 时,浏览器会解析到本地地址(127.0.0.1),从而访问本地的服务。

为什么代理会影响 hosts 文件的配置?

当使用代理时,所有的网络请求(包括 DNS 查询)都可能会经过代理服务器。代理服务器会忽略本地的 hosts 文件,直接使用其自己的 DNS 解析。因此,即使在 hosts 文件中配置了域名映射,代理服务器仍然可能使用其 DNS 配置来解析域名。

解决方法

  1. 关闭代理

    • 如果是全局代理,所有网络请求都会经过代理,hosts 文件配置将无效

    • 如果是手动代理,可以手动关闭代理

  2. 使用 SOCKS5 或 HTTP 代理的 DNS 设置

    • 如果代理支持自定义 DNS 解析,可以配置代理使用本地的 DNS 解析

    • 在代理设置中启用 "Use local DNS" 或 "Bypass DNS proxy" 选项

  3. 检查代理配置

    • 如果在浏览器中使用的是 HTTP 代理,可以尝试在代理设置中禁用 DNS 解析
  4. 使用不同的代理模式

    • 一些代理软件允许设置绕过特定地址的代理模式
  5. 直接修改代理的 DNS 配置

    • 如有权限,可修改代理服务器的 DNS 配置

hosts 文件的使用场景

1. 将域名指向本地 127.0.0.1

127.0.0.1 mywebsite.local

将 mywebsite.local 指向本地地址 127.0.0.1

2. 将域名映射到特定的 IP 地址

192.168.X.X adblock.com

将 adblock.com 指向内网 IP 192.168.X.X

3. 将域名指向无效地址

0.0.0.0   unwanted-site.com

将 unwanted-site.com 指向无效地址,从而阻止访问

不同上下文中 0.0.0.0 的含义

  1. 在 hosts 文件中:无效/不可路由的 IP 地址,用于阻止域名解析

  2. 在服务器监听配置中:表示"监听所有网络接口",包括:

    • 本机环回接口 (127.0.0.1)

    • 局域网接口 (如 192.168.x.x)

    • 公网 IP 接口

    • 其他所有可用网络接口

例如:app.listen(3000, '0.0.0.0') 或 listen 0.0.0.0:80; 表示在所有可用网络接口上监听指定端口。

特殊应用场景

处理线上回调到本地开发环境

有时候,开发过程中需要处理第三方回调,例如支付回调、OAuth 登录回调等。这些回调通常要求使用线上域名。可以使用以下步骤将线上回调引导到本地开发环境:

  1. 在本地 hosts 文件中映射线上域名到本地

    127.0.0.1    callback.example.com
  2. 配置本地 HTTPS 证书 使用 mkcert 等工具生成本地证书:

    • 创建本地开发证书

    • 配置本地服务器使用该域名和 HTTPS 证书

  3. 本地启动开发服务器,监听相应端口(通常是 443 或自定义端口)

实际例子

假设有支付服务需要回调到 https://pay.myapp.com/callback:

  1. hosts 文件配置:

    127.0.0.1    pay.myapp.com
  2. 本地 HTTPS 配置(以 Node.js 为例):

    const https = require("https");
    const fs = require("fs");
    const express = require("express");
    
    const app = express();
    
    app.post("/callback", (req, res) => {
      console.log("收到支付回调", req.body);
      res.send("success");
    });
    
    const options = {
      key: fs.readFileSync("./certificates/pay.myapp.com-key.pem"),
      cert: fs.readFileSync("./certificates/pay.myapp.com.pem"),
    };
    
    https.createServer(options, app).listen(443, () => {
      console.log("HTTPS服务运行在443端口");
    });
  3. 使用 mkcert 生成本地证书:

    mkcert pay.myapp.com

注意事项

  • 需要管理员/root 权限配置 443 端口

  • 本地证书不会被外部服务信任,但对本地开发足够

  • 确保关闭代理以避免 DNS 解析绕过 hosts 文件

  • 回调处理完成后,恢复 hosts 文件以避免影响正常访问

最佳实践

  1. 域名配置

    • 同时配置带 www 和不带 www 的域名版本

    • 子域名需单独配置

  2. 本地服务配置

    • 确保本地服务监听正确的端口

    • 需要 HTTPS 时,配置正确的 SSL 证书

  3. 定期检查

    • 及时清理不再使用的 hosts 配置

    • 确保配置的 IP 地址是正确的

最后更新时间:
贡献者: 何风顺
下一页
Cloudflare DNS与代理:完全指南