如果本地网站或开发服务器可以通过 127.0.0.1 访问,但无法通过 localhost 访问,或者仅适用于某一种地址族,请检查服务器的侦听地址并分别测试每条路径。在 Mac 上,127.0.0.1 是 IPv4 环回地址,::1 是 IPv6 环回地址;两者都指向您自己的电脑。在其中一个地址上测试成功并不能证明服务也在另一个地址上侦听。
1. 检查服务是否正在侦听
使用您的应用程序理应提供服务的端口。以下示例使用端口 8000;请将其替换为实际端口。
lsof -nP -iTCP:8000 -sTCP:LISTEN
lsof 会列出打开的文件,包括网络套接字。这些选项将结果限定为该端口上的 TCP 侦听器,并避免解析名称。如果没有输出,则服务可能未在运行、可能使用了不同的端口,或者可能未打开 TCP 侦听器。在更改 macOS 网络设置之前,请先检查应用程序的启动输出和配置的端口。(lsof 手册)
查看 NAME 列中的地址。显示在 127.0.0.1:8000 上的侦听器绑定到了 IPv4 环回;显示在 [::1]:8000 上的侦听器绑定到了 IPv6 环回。通配符地址可能表示侦听的范围不仅限于环回,具体取决于服务器和操作系统。关键的诊断步骤是确认服务器的实际绑定地址是否包含您正在测试的地址族。此解释基于 lsof 报告的套接字地址;应用程序配置决定了服务器打开哪个地址。
2. 直接测试 IPv4 和 IPv6
通过各个环回地址向相同的端口和路径发出请求。curl 允许您测试 HTTP 连接,而无需依赖浏览器的地址选择策略。
curl -v --connect-timeout 3 http://127.0.0.1:8000/
curl -g -v --connect-timeout 3 'http://[::1]:8000/'
在 URL 中使用 IPv6 字面量时必须加方括号;-g 告诉 curl 不要将它们视为 URL glob 语法。单引号可在默认的 macOS shell 中按原样保留 URL。Curl 记录了这些 URL 规则,并提供了 --ipv4 和 --ipv6 来约束主机名解析。(curl URL 语法,curl 手册)
连接被拒绝通常意味着在该地址和端口上没有接收连接的侦听器。超时则表明连接未在限制时间内完成。如果 curl 输出了 HTTP 响应(包括类似 404 的错误状态),则说明 TCP 和 HTTP 连接已成功到达服务器;此时应调查路径或应用程序响应,而不是将其视为 IPv4/IPv6 连接故障。
3. 将 localhost 与各个地址进行对比
现在使用 curl 的 IPv4 和 IPv6 选项测试主机名,然后尝试在没有地址族限制的情况下进行测试:
curl -4 -v --connect-timeout 3 http://localhost:8000/
curl -6 -v --connect-timeout 3 http://localhost:8000/
curl -v --connect-timeout 3 http://localhost:8000/
Curl 的 -4 和 -6 选项用于请求仅限 IPv4 或仅限 IPv6 的主机名地址。其文档指出,macOS 可能会在纯 IPv6 解析请求中返回 IPv4 映射地址,因此请将这些测试视为 curl 的受限连接尝试,而不是对每个应用程序解析器行为的全面审计。(curl 手册)
利用测试结果来缩小原因范围。如果直接 IPv4 测试成功而直接 IPv6 测试失败,同时 lsof 仅显示 IPv4 侦听器,那么在需要 IPv6 访问的情况下,服务器可能需要配置为同时侦听 IPv6。仅有 IPv6 侦听器正常工作时,情况则相反。如果两次直接测试均成功但 localhost 失败,请对比强制地址族的 curl 结果,并检查应用程序的主机名、代理或 URL 设置。不同的应用程序解析名称或连接到名称的方式可能有所不同;Apple 建议构建需要处理 IPv4 和 IPv6 的应用程序的开发者使用与地址族无关的网络 API。(Apple 开发者:支持纯 IPv6 网络)
4. 根据依据采取修复措施
当只有一个环回地址接受连接时,请更改本地服务器的绑定地址配置,或使用它实际支持的地址族。不要指望通过更改 Mac 的 Wi-Fi IPv4 或 IPv6 设置来修复环回侦听器:环回请求的目标是 Mac 本身,而这些“网络”设置配置的是网络接口的网络连接。Apple 的 TCP/IP 控制项可以为选定的网络服务配置 IPv4 和 IPv6,但它们无法配置单个应用程序的侦听套接字。(Apple 支持:在 Mac 上更改 TCP/IP 设置)
如果两个直接地址都不起作用,请确认服务器正在运行、端口正确,且预期的协议是 HTTP 或 HTTPS。如果一个直接地址有效但主机名测试结果不同,请结合使用 lsof 地址和 curl 输出,以决定是调整服务器绑定地址还是客户端 URL。这一排查流程可以将侦听器缺失与特定地址族的绑定问题区分开来,而无需假定每个 localhost 故障都是 DNS 问题。
参考来源
在 Mac 上更改 TCP/IP 设置 — Apple 支持
支持纯 IPv6 网络 — Apple 开发者
curl URL 语法 — curl
curl - 如何使用 — curl
man page lsof section 8 — manpagez