为什么 localhost 在给定端口上无法解析为 127.0.0.1?

ich*_*len 1 networking

我有一个在端口 80 上运行的 httpd 服务器和在端口 3838 上运行的 Shiny -server。当我尝试时,我得到了在 Shiny -server上提供curl 127.0.0.1:3838的索引文件。但是当我尝试curl localhost:3838curl 超时而不检索任何内容时。为什么?

这是我的 /etc/hosts 文件的内容:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
<my-ipv4-address> www.<mywebsite>.com <mywebsite>.com
<my-ipv6-address> www.<mywebsite>.com <mywebsite>.com
Run Code Online (Sandbox Code Playgroud)

和结果 getent ahosts localhost

::1             STREAM localhost
::1             DGRAM  
::1             RAW    
127.0.0.1       STREAM 
127.0.0.1       DGRAM  
127.0.0.1       RAW    
Run Code Online (Sandbox Code Playgroud)

dir*_*rkt 5

从 中可以看出getent ahosts localhost,localhost 的 IPv6 条目优先于 IPv4 条目。(见man getentman nss,如果你想知道为什么这个命令帮助)。

Curl 是双栈的,可以解析 IPv6 和 IPv4 地址,所以它使用 IPv6 地址。但是闪亮的服务器不适用于 IPv6,因此它超时,直接使用 IPv6 地址时已验证。OTOH,如果你使用127.0.0.1,这是一个 IPv4 地址,所以它成功了。