三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Chrome ERR_FAILED错误排查指南:从网络诊断到本地开发环境修复

Chrome ERR_FAILED错误排查指南:从网络诊断到本地开发环境修复

1. 问题初探:当Chrome对你说“ERR_FAILED”

如果你也像我一样,每天的工作和生活都离不开Chrome浏览器,那么遇到它突然罢工,弹出一个冷冰冰的“ERR_FAILED”错误,绝对是一件让人血压飙升的事情。这个错误不像404那样明确告诉你“页面没找到”,也不像502那样暗示“服务器挂了”,它更像一个笼统的“系统错误”,把所有可能的问题都打包在一起,然后告诉你:“出错了,但具体是什么错,你自己猜吧。”

我最近就遇到了这么一档子事。当时我正在调试一个本地开发的前端项目,页面加载到一半,Chrome突然卡住,然后地址栏下方就出现了那个熟悉的红色警告图标,点开一看,正是“ERR_FAILED”。刷新、重启浏览器、甚至重启电脑,问题依旧。那一刻,我感觉自己不是在写代码,而是在玩一个没有攻略的解谜游戏。

“ERR_FAILED”是Chrome网络栈(NetError)中的一个通用错误代码,它本质上意味着浏览器发起了一个网络请求,但这个请求在某个环节彻底失败了,以至于无法归类到更具体的错误类型(如连接超时、DNS解析失败等)。你可以把它理解为网络请求的“猝死”,死因不明。正因为其模糊性,排查起来往往需要一套系统性的“体检”流程。今天,我就把自己解决这个问题的完整思路和实操步骤梳理出来,希望能帮你下次遇到时,能快速定位,而不是对着屏幕干瞪眼。

2. 系统性排查:从网络到本地的全方位诊断

面对“ERR_FAILED”,盲目尝试是效率最低的做法。我们需要建立一个从外到内、从简单到复杂的排查逻辑树。这就像医生看病,先问诊、量体温(基础检查),再抽血、拍片(深入诊断)。

2.1 第一步:基础网络环境检查(排除“外患”)

首先,我们要确认问题是否出在更广泛的网络层面,而不是Chrome自身。

  1. 访问其他网站:这是最快速的验证。尝试打开google.combaidu.com这类绝对稳定的网站。如果它们也打不开,那问题很可能出在你的操作系统网络设置、路由器或宽带服务上。这时,你应该检查网络连接、重启路由器,或者用手机热点测试一下。

  2. 使用其他浏览器测试:立即打开Edge、Firefox或Safari,访问同一个出错的网址。如果其他浏览器能正常打开,那么问题就基本锁定在Chrome及其相关配置上。这是一个非常关键的分水岭。

  3. 检查系统代理设置:很多开发环境或公司网络会要求设置系统代理。错误的代理配置是导致“ERR_FAILED”的常见元凶。

    • Windows:设置 -> 网络和Internet -> 代理。检查“使用代理服务器”是否被意外开启,或者代理地址/端口是否正确。
    • macOS:系统设置 -> 网络 -> 选择当前网络 -> 详细信息 -> 代理。
    • 提示:如果你并不需要使用代理,请确保此处是关闭的。有时一些软件会静默修改这里的设置。
  4. 命令行网络诊断:打开终端(Windows CMD/PowerShell, macOS/Linux Terminal),使用几个简单命令:

    • ping 目标域名:检查是否能到达目标服务器。但注意,很多服务器禁用了ping,所以不通不绝对代表有问题。
    • nslookup 目标域名dig 目标域名:检查DNS解析是否正常。如果返回的是非权威应答或超时,可能是DNS问题。可以尝试将DNS服务器临时改为8.8.8.8(Google) 或114.114.114.114(国内) 进行测试。

完成以上四步,如果确认只有Chrome访问特定网站(尤其是本地地址如localhost127.0.0.1)有问题,而其他浏览器和网络均正常,那么我们就可以深入Chrome内部了。

2.2 第二步:聚焦Chrome内部问题(清理“内忧”)

当问题局限在Chrome后,我们的排查就可以更有针对性了。以下操作按对个人数据影响从小到大的顺序进行。

  1. 使用无痕模式(Incognito Mode)测试:按下Ctrl+Shift+N(Windows/Linux) 或Cmd+Shift+N(macOS) 打开无痕窗口,再次访问出错网址。无痕模式会禁用所有扩展程序,并使用一个干净的临时用户配置文件。

    • 如果无痕模式下正常:恭喜,问题极大概率出在你安装的某个浏览器扩展程序(插件)上。这是最常见的原因之一。接下来就需要进入扩展管理页面(chrome://extensions/),通过“二分法”逐个禁用扩展来定位罪魁祸首。特别是那些涉及网络请求、广告拦截、隐私保护的插件(如AdBlock、隐私獾等)。
    • 如果无痕模式下依然报错:说明问题与扩展无关,需要继续向下排查。
  2. 清除浏览数据:有时,陈旧的缓存、Cookie或损坏的浏览器数据会导致奇怪的问题。按下Ctrl+Shift+Delete打开清除浏览数据窗口。

    • 时间范围:选择“时间不限”。
    • 清除项:至少勾选“缓存的图片和文件”、“Cookie及其他网站数据”。你也可以全选以彻底清理。
    • 高级选项:如果问题涉及特定网站,可以在“高级”标签页下更精细地操作。
    • 清理后,重启Chrome再试。
  3. 重置Chrome网络设置:Chrome内部有一个网络诊断和重置工具,非常有用。

    • 在地址栏输入chrome://net-internals/#dns,点击“Clear host cache”清除DNS缓存。
    • 然后转到chrome://net-internals/#sockets,点击“Flush socket pools”刷新套接字池。
    • 最后,可以尝试在chrome://net-internals/#events查看网络事件,但这需要一定的分析能力。更直接的方法是访问chrome://net-internals/#hsts,在“Delete domain security policies”部分,你可以尝试输入出问题的域名并删除其安全策略(谨慎操作,这会使你下次访问该站点的HTTPS连接降级为HTTP,仅用于测试)。

3. 深入核心:针对开发与本地环境的专项排查

如果你是一名开发者,并且“ERR_FAILED”出现在访问localhost127.0.0.1或某个本地IP(如192.168.x.x)时,那么问题很可能与开发环境、安全策略或浏览器的新特性有关。以下是我在开发中遇到并解决过的几种典型场景。

3.1 场景一:HTTPS/SSL证书问题(本地开发最常见)

现代前端开发(如Vue CLI、Create React App)默认启用了HTTPS的本地开发服务器。浏览器对HTTPS证书有严格校验。

  • 问题表现:访问https://localhost:3000时出现“ERR_FAILED”或“NET::ERR_CERT_INVALID”。
  • 根因分析:开发服务器使用的通常是自签名证书,不被操作系统或浏览器信任。
  • 解决方案
    1. 直接点击“高级”->“继续前往localhost(不安全)”:这是最快捷的临时方案,但每次都可能弹警告。
    2. 将证书信任到系统:在浏览器中导出开发服务器的证书(通常在访问页面时点击锁图标->证书信息->导出),然后将其导入到操作系统的“受信任的根证书颁发机构”存储中。此操作一劳永逸,但步骤稍复杂且需注意安全。
    3. 为Chrome添加启动参数(不推荐长期使用):关闭Chrome,通过命令行启动,如chrome --ignore-certificate-errors。这会忽略所有证书错误,极度危险,会降低你的浏览安全性,仅限在绝对隔离的测试环境使用。

3.2 场景二:CORS(跨源资源共享)策略阻塞

这在前后端分离开发中极其常见。前端运行在localhost:3000,后端API在localhost:8080,浏览器出于安全考虑会阻止这种跨域请求。

  • 问题表现:前端页面能打开,但调用后端API的AJAX/Fetch请求在开发者工具的Network面板中显示为红色,状态是“ERR_FAILED”或“CORS error”。
  • 根因分析:后端服务器没有正确返回Access-Control-Allow-Origin等CORS响应头。
  • 解决方案
    1. 后端配置:确保你的后端服务(如Node.js的Express、Spring Boot等)正确配置了CORS中间件,允许前端源的请求。
    2. 临时绕过(仅开发):可以安装如“Moesif CORS”这类Chrome扩展,一键为当前标签页启用CORS。或者,使用一个更“硬核”的方法:关闭所有Chrome窗口,然后用命令行启动一个禁用Web安全功能的Chrome实例:chrome --disable-web-security --user-data-dir=/tmp/chrome_test同样,此方法会严重降低浏览器安全性,绝对不要用于日常浏览。

3.3 场景三:Chrome安全策略升级导致的“私有网络请求”阻塞

这是近年来导致本地开发出现“ERR_FAILED”的一个高频且隐蔽的原因,也是我最近踩坑的重点。Chrome从94版本左右开始,逐步实施了一项名为“阻止不安全的私有网络请求”(Block insecure private network requests)的安全策略。

  • 问题表现:一个公网HTTPS页面(例如,你部署在测试环境的https://staging.example.com)试图通过JavaScript向你的本地私有网络地址(如http://localhost:8080http://192.168.1.100:3000)发起请求时,会被浏览器直接阻止,并报错“ERR_FAILED”。在开发者工具Console中,你可能会看到更具体的错误信息,如[Deprecation]警告,提示即将阻止跨源向本地网络的请求。
  • 根因分析:为了防止恶意网站扫描或攻击你的内部网络(如路由器、智能设备),Chrome要求从公网HTTPS上下文发往私有网络(如localhost、192.168.x.x、10.x.x.x等)的请求,目标也必须使用HTTPS。
  • 解决方案
    1. 终极方案(推荐):让你的本地服务也支持HTTPS。这是最符合安全规范的做法。使用mkcert等工具为本地服务生成并信任一个本地CA证书。
    2. 临时方案:在Chrome中暂时禁用此策略进行测试。
      • 在地址栏输入chrome://flags/#block-insecure-private-network-requests
      • 将该项的设置从“Default”改为“Disabled”。
      • 重启Chrome。
      • 重要提示:这只是一个临时的开发调试手段。在Chrome的未来版本中,此实验性标志可能会被移除,且长期禁用会带来安全风险。完成测试后,应改回“Default”或“Enabled”。
    3. 配置响应头:如果你的本地服务可控,可以在其响应中添加一个特定的权限策略头:Permissions-Policy: public-client-requests=*。但这需要服务端支持。

4. 高级工具与底层修复:当常规手段全部失效

如果以上所有方法都试过了,问题依然存在,那么我们需要动用一些“重型武器”和底层检查。

4.1 利用Chrome开发者工具进行深度诊断

开发者工具(DevTools)的Network面板是你的“手术刀”。

  1. 打开Network面板:按F12,切换到Network标签页。
  2. 重现错误:访问出错的页面。
  3. 分析请求:找到状态为“(failed)”或红色的那条请求记录,点击它。
  4. 查看详情
    • Headers:查看请求头和响应头,检查是否有异常的头信息或被服务器拒绝的迹象。
    • Preview/Response:看服务器是否返回了任何信息。
    • Initiator:查看是哪个脚本发起了这个请求。
    • Timing:查看“瀑布图”(Waterfall),分析请求在哪个阶段耗时过长或失败(如DNS查询、TCP连接、SSL握手、等待服务器响应等)。如果某个阶段显示为红色或时间极长,那就是线索。
  5. Console面板:这里通常会有更详细的JavaScript错误信息或网络错误日志,比地址栏的提示更有用。

4.2 检查Hosts文件与防火墙

有时问题出在更底层。

  • Hosts文件:系统Hosts文件(C:\Windows\System32\drivers\etc\hosts/etc/hosts)的错误映射可能导致域名被解析到错误的IP或直接被屏蔽。用文本编辑器(需管理员权限)打开它,检查是否有关键域名的异常记录。
  • 防火墙/安全软件:无论是Windows Defender防火墙还是第三方安全软件(如360、电脑管家等),都可能将Chrome或某个端口的网络访问误判为威胁而阻止。尝试暂时完全禁用防火墙和安全软件(测试后请记得恢复),看问题是否消失。如果消失,则需要在这些软件中为Chrome或你的本地服务端口添加例外规则。

4.3 终极手段:重置或重装Chrome

如果所有迹象都指向Chrome的用户配置文件(User Data)本身已损坏,那么可以考虑重置。

  1. 备份:首先,备份你的书签(通过书签管理器导出)、保存的密码等重要数据。
  2. 重置Chrome:在设置中搜索“重置设置”,点击“将设置恢复为原始默认值”。这会重置所有设置、禁用所有扩展、清除Cookie和站点数据,但会保留书签、历史记录和密码。
  3. 创建新的用户配置文件:在设置中,进入“您和Google”->“管理其他用户”,添加一个新用户,用这个全新的配置文件登录Chrome进行测试。
  4. 完全卸载重装:作为最后的手段,使用专业的卸载工具(如Revo Uninstaller)或系统自带的卸载程序彻底移除Chrome,并手动删除其残留的用户数据文件夹(默认位于%LOCALAPPDATA%\Google\Chrome\User Data),然后重新安装最新版本的Chrome。

5. 实战案例复盘:一次由混合内容与安全策略引发的“ERR_FAILED”

让我分享一个最近解决的典型案例,它综合了上述多个因素。我的一个本地开发项目,前端是https://localhost:3000,后端API是http://localhost:8080。在Chrome 115版本中,前端页面加载正常,但所有API请求都报“ERR_FAILED”。

  1. 初步排查:无痕模式下问题依旧,排除插件干扰。其他浏览器(Firefox)正常,锁定Chrome问题。
  2. Network面板分析:发现API请求的状态是“(blocked:other)”,在Console中有警告:“Mixed Content: The page at ‘https://localhost:3000/‘ was loaded over HTTPS, but requested an insecure resource ‘http://localhost:8080/api/data‘. This request has been blocked; the content must be served over HTTPS.”
  3. 问题定性:这是典型的“混合内容”问题。HTTPS页面内嵌了HTTP资源,被浏览器安全策略阻止。但为什么之前版本可以?因为Chrome对localhost的混合内容一向比较宽容。
  4. 深入探究:结合查阅资料,我意识到这不仅仅是混合内容问题,还触发了前面提到的“阻止不安全的私有网络请求”策略。我的https://localhost:3000在Chrome看来是一个“安全的上下文”(尽管是自签名证书),它向http://localhost:8080发请求,构成了从“安全上下文”到“私有网络不安全端点”的访问,双重违规。
  5. 解决方案
    • 短期:我按照3.3节的方法,将chrome://flags/#block-insecure-private-network-requests设置为Disabled,并确保后端API的响应头包含了Permissions-Policy: public-client-requests=*。问题立即解决。
    • 长期:我使用mkcert为我的本地后端服务localhost:8080也创建并安装了有效的本地HTTPS证书,将其升级为https://localhost:8080。这样,前后端都运行在HTTPS下,彻底根除了混合内容和私有网络请求的安全警告,一劳永逸。

这个案例给我的教训是,浏览器的安全策略在不断收紧,本地开发的“便利性”和“安全性”之间的平衡在动态变化。作为开发者,我们需要保持对Chrome等浏览器重大更新日志的关注,尤其是安全相关的变更,并尽早让本地开发环境适配这些最佳安全实践,而不是总依赖于临时禁用策略的“野路子”。毕竟,在本地模拟真实的生产环境(全HTTPS),本身就是一种良好的开发习惯。

← 返回列表