解决 WSL2 + Windows Hosts + 开启 VPN 后无法访问本地 Web 服务的问题

问题

场景描述:你在 WSL2 中运行了一个 Web 服务(如 Nginx、Go、Php、Node.js 等)。在 Windows 的 hosts 文件中绑定了域名(如 dev.wsl.net -> 172.x.x.x,以便在 Windows 浏览器中访问该服务。不开 VPN 时一切正常,但一旦开启公司或个人的 全流量接管型 VPN,Windows 就无法解析该域名,导致页面打不开。

本文将详细介绍这个问题的原因,并提供一个简单有效的解决方案:使用 .localhost 域名


🔍 问题描述

✅ 正常情况

  • WSL2 中运行的 Web 服务可以通过绑定的域名(如 http://dev.wsl.net)从 Windows 浏览器访问。
  • 例如,在 Windows 的 hosts 文件中有如下配置:
  1. 172.28.123.45 dev.wsl.net

❌ 开启 VPN 后

  • 开启公司或个人的 全流量接管型 VPN 后,尝试访问 http://dev.wsl.net 会失败,提示“无法访问此网站”或 DNS 解析失败。

🛠️ 导致问题的原因

1. VPN 劫持了所有 DNS 请求

许多企业级或安全型 VPN(如 Cisco AnyConnect、Palo Alto GlobalProtect、OpenVPN 全隧道模式)会:

  • 强制所有 DNS 查询走远程服务器
  • 忽略或绕过本地 C:\Windows\System32\drivers\etc\hosts 文件
  • 启用 DNS over HTTPS (DoH),进一步跳过本地解析。

2. 结果

当开启 VPN 后:

  • 访问 dev.wsl.net → 不再查 hosts → 发送 DNS 请求到远程 → 远程返回“不存在” → 访问失败 ❌

✅ 解决方案:使用 .localhost 域名

根据 RFC 6761,.localhost 域名必须解析为回环地址,且不得通过网络 DNS 查询。因此,它不会被任何远程 DNS 或 DoH 影响。

操作步骤:

1. 修改 Windows 的 hosts 文件

以管理员身份打开 C:\Windows\System32\drivers\etc\hosts,将原来的:

172.28.123.45 dev.wsl.net

改为:

172.28.123.45 wsl.localhost
2. 保存文件
3. 在 Windows 浏览器中访问
http://wsl.localhost
4. 现在,无论是否开启 VPN,都能正常访问!✅

🧪 验证方法

在开启 VPN 的状态下,在 Windows 中执行:

ping wsl.localhost

如果返回的是你的 WSL2 IP(如 172.28.123.45),说明解析成功 ✅
如果提示“找不到主机”,说明你还没改 hosts 或拼写错误 ❌


⚠️ 注意事项

  1. 必须用 .localhost,不能是 .local.test 等
  • .local 会被 mDNS(Bonjour/Zeroconf)接管,可能不稳定;
  • .test 虽也是保留域名,但部分企业 VPN 仍可能劫持;
  • 只有 .localhost 是 100% 强制本地解析的
  • 不要用 localhost 本身
    • localhost 默认指向 127.0.0.1(Windows 自己),而不是 WSL2;
    • 所以要用 子域名,如 app.localhostapi.localhost
  • 确保 WSL2 服务监听 0.0.0.0
    例如 Nginx 配置:或 Node.js:
    1. app.listen(3000,'0.0.0.0',()=>{...})
    1. server {
    2.     listen 80;
    3.     server_name app.localhost;# 可选
    4. ...
    5. }
    • 在 WSL2 中运行的 Web 服务,通过 Windows 的 hosts 文件绑定域名(如 dev.wsl.net -> 172.x.x.x)访问。
    • 开启全流量接管型 VPN 后,Windows 无法解析该域名,导致页面打不开。
    • 开启 VPN 后,Windows 的 DNS 请求被强制走远程服务器,忽略本地 hosts 文件,导致域名解析失败。
    • 使用 .localhost 域名代替 .local 或其他自定义域名。
      • 修改 Windows 的 hosts 文件,将 dev.wsl.net 改为 wsl.localhost
      • 在浏览器中访问 http://wsl.localhost

✅ 总结

问题

导致问题的原因

解决方案

总结

问题

解决方法

开启 VPN 后 dev.wsl.net 无法访问

改为 wsl.localhost 或 dev.wsl.localhost

原因

VPN 劫持 DNS,绕过本地 hosts

为什么 .localhost 有效

RFC 强制本地解析,不走 DNS

是否需要重启 WSL?

❌ 不需要

是否需要改代码?

❌ 只需改 hosts 和浏览器地址栏


💡 一句话终极答案
把你的开发域名从 xxx.local 改成 xxx.localhost,并在 Windows hosts 中绑定 WSL2 IP,即可在开 VPN 时正常访问。

这是目前最简单、最可靠、兼容性最好的方案,已被无数开发者验证 ✅试试看吧!如果有任何问题,欢迎继续交流 😊

Read more

Claude AI注册避坑指南:5分钟搞定海外手机号验证(附最新解决方案)

Claude AI 注册实战:从验证难题到高效上手的完整路径 最近几个月,身边不少朋友和同事都在讨论一个现象:想体验一下那个以“安全”和“长上下文”著称的Claude AI,却在注册的第一步——手机号验证——就卡住了。这确实是个挺让人头疼的体验,明明技术产品就在眼前,却因为一个看似简单的步骤而无法触及。对于国内的开发者、产品经理或是AI爱好者来说,这种“看得见却用不上”的感觉尤其强烈。这篇文章,就是为你准备的。我们不谈空泛的理论,只聚焦于一个核心目标:如何绕过那些常见的障碍,顺利、安全地完成Claude账户的注册与初步设置,并为你梳理清楚后续高效使用的关键点。整个过程,力求在5分钟内给你一个清晰的行动路线。 1. 理解注册流程的核心关卡与常见误区 在动手操作之前,我们先花点时间拆解一下Claude的注册流程,特别是那个让很多人“折戟”的环节。这能帮你避开很多不必要的试错,直接找到有效的路径。 Claude的官方注册流程,本质上和大多数国际主流互联网服务类似:邮箱验证 -> 手机号验证 ->

(第三篇)Spring AI 实战进阶:从0开发IDEA插件版AI代码助手(Java全栈+上下文感知)

(第三篇)Spring AI 实战进阶:从0开发IDEA插件版AI代码助手(Java全栈+上下文感知)

前言 作为 Java 开发者,我们每天都在重复编写 CRUD 代码、调试语法错误、优化性能问题 —— 这些机械性工作占用了大量时间,而市面上的通用 AI 代码助手(如 Copilot)往往无法精准感知项目上下文(比如项目的包结构、依赖版本、数据库表结构),生成的代码需要大量修改才能落地。 笔者近期基于 Spring AI+IDEA 插件开发了一款定制化 AI 代码助手:后端基于 Spring AI 整合 JavaParser、Maven API 实现代码解析与生成,前端通过 IDEA 插件提供对话窗口和一键插入代码功能,支持需求描述→完整代码生成代码优化、上下文感知、补全三大核心能力。本文将从实战角度,完整拆解这款 AI 代码助手的开发全流程,所有代码均为生产环境可直接复用的实战代码,同时结合可视化图表清晰呈现核心逻辑,希望能帮你打造专属的 AI

猫头虎AI赠书第12期赠书活动:《扣子Skills+OpenClaw实战:零基础玩转AI智能体》

猫头虎AI赠书第12期赠书活动:《扣子Skills+OpenClaw实战:零基础玩转AI智能体》

猫头虎AI赠书第12期赠书活动:《扣子Skills+OpenClaw实战:零基础玩转AI智能体》 📌摘要 🚀大消息来啦!猫头虎AI赠书第12期火热启动🔥!这次,我为大家精选了《扣子Skills+OpenClaw实战:零基础玩转AI智能体 》📚。想要免费拿到这本书?简单到不能再简单:关注我的博客✨,添加我的wx📲,在文章下方留言 "我要学习扣子龙虾! !! "💬。3月30日,我将为大家挑选出②位幸运读者🎁,并在评论区与朋友圈公布!手里还藏着宝贵的源代码,等你来夺🌈!赶快行动起来,机会难得! 📢引言 亲爱的朋友们,大家好!👋是我,猫头虎博主!今天,我为大家带来了猫头虎AI赠书第12期的特别惊喜🎊!这次我将赠送的是一本精心挑选的 《扣子Skills+OpenClaw实战:零基础玩转AI智能体》 🌟。这本书内容丰富,无论你是新手还是老鸟,都能找到属于你的知识宝藏🔍。希望大家能喜欢这个小惊喜,和我一起分享这场编程的盛宴!🥳 文章目录 * 猫头虎AI赠书第12期赠书活动:《扣子Skills+OpenClaw实战:零基础玩转AI智能体》 * 📖关于