Я только что перешел с Mavericks на Yosemite и теперь curl
не вижу петлевые имена хостов.
Настройте простой http-сервер для тестирования:
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
Теперь я могу поразить localhost: 8000 в Chrome. Я могу даже увидеть это. Но в curl это происходит:
$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused
Тем не менее, это работает:
$ curl 127.0.0.1:8000
Я прочитал этот ответ о настройках прокси wget , но это не помогло, потому что это работает:
$ wget --proxy=off localhost:8000
Это действительно расстраивает, потому что у меня есть несколько разных имен узлов обратной связи в моем /etc/hosts
файле, так что я могу разрабатывать приложения локально, и я привык к их отладке с помощью curl.
Я пробовал с версией curl, которая поставляется с osx:
$ curl --version
curl 7.37.1 (x86_64-apple-darwin14.0) libcurl/7.37.1 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IPv6 Largefile NTLM NTLM_WB SSL libz
$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused
$ curl 127.0.0.1 # works
И я попытался скомпилировать curl с brew:
$ /usr/local/Cellar/curl/7.38.0/bin/curl --version
curl 7.38.0 (x86_64-apple-darwin14.0.0) libcurl/7.38.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: IPv6 Largefile NTLM NTLM_WB SSL libz
$ /usr/local/Cellar/curl/7.38.0/bin/curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused
$ /usr/local/Cellar/curl/7.38.0/bin/curl 127.0.0.1:8000 # works
localhost
curl
hosts-file
osx-yosemite
Ник Реталлак
источник
источник
Ответы:
Я просто заставил его работать, закомментировав одну из строк обратной петли IPv6 из моего файла / etc / hosts:
Теперь все мои петлевые имена хостов работают, а не только localhost. Интересно, что с этим?
источник
Альтернатива (не требует sudo или модификации
/etc/hosts
) - всегда используйте ipv4, пока curl не станет умнее.(тогда все будет работать как надо)
источник
Прежде всего,
0.0.0.0
это специальный адрес, означающий «любой адрес IPv4».Сокет может быть связан с протоколом IPv4 или IPv6. Если к сокету привязано
0.0.0.0
, это означает, что он будет прослушивать любой IPv4, пытающийся подключиться к нему, и будет представлен следующим образом:*
Знак эквивалентен0.0.0.0
на IPv4.Для IPv6:
*
Знак эквивалентен::
на IPv6, как в официальной спецификации .Причина в том, что он
curl
пытается разрешить случайнуюlocalhost
запись в/etc/hosts
, и, как упомянул @NickRetallack, эта запись выбираетсяcurl
при разрешенииlocalhost
в режиме по умолчанию (предположительно, IPv6 или IPv4, что разрешается первым).Принуждение его в
--ipv4
режиме, как это предлагается @CharlesHebdough, сделаетcurl
решимостьlocalhost
к127.0.0.1
(предполагая , что нет других записей IPv4 дляlocalhost
в/etc/hosts
).Каждая реализация будет разрешаться
localhost
по своему усмотрению, поэтому вы имели периодический успех с различными инструментами.Чтобы быть максимально точным, используйте
127.0.0.1
вместо localhost, но он привязывает вас к IPv4.localhost
дает вам гибкость для работы как с протоколами IPv6, так и с протоколами IPv4, однако в некоторых реализациях у вас могут возникнуть проблемы, как в этой конкретной версииcurl
.источник