Saya baru saja meningkatkan dari Mavericks ke Yosemite, dan sekarang curl
tidak dapat melihat nama host loopback.
Siapkan server http sederhana untuk menguji:
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
Sekarang saya dapat menekan localhost: 8000 di chrome. Aku bahkan bisa melupakannya. Tetapi dalam ikal, ini terjadi:
$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused
Namun, ini berfungsi:
$ curl 127.0.0.1:8000
Saya membaca jawaban ini tentang pengaturan proxy wget , tetapi tidak membantu, karena ini berfungsi:
$ wget --proxy=off localhost:8000
Ini benar-benar membuat frustrasi, karena saya memiliki beberapa nama host loopback berbeda yang tercantum dalam /etc/hosts
file saya sehingga saya dapat mengembangkan aplikasi secara lokal, dan saya terbiasa men-debug mereka dengan curl.
Saya sudah mencoba dengan versi curl yang disertakan dengan 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
Dan saya sudah mencoba mengkompilasi ikal dengan minuman:
$ /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
sumber
Jawaban:
Saya baru saja bekerja dengan mengomentari salah satu baris loopback IPv6 dari file / etc / hosts saya:
Sekarang semua nama host loopback saya berfungsi, bukan hanya localhost. Aku ingin tahu ada apa dengan ini?
sumber
Alternatif (tidak memerlukan sudo atau modifikasi
/etc/hosts
) - selalu gunakan ipv4 sampai curl menjadi lebih pintar.(maka semuanya akan berfungsi seperti yang diinginkan)
sumber
Pertama-tama,
0.0.0.0
adalah alamat khusus yang berarti "alamat IPv4".Soket dapat diikat ke protokol IPv4 atau IPv6. Jika soket terikat
0.0.0.0
, itu berarti ia akan mendengarkan IPv4 yang mencoba menyambungkannya, dan akan ditampilkan sebagai berikut:The
*
tanda setara dengan0.0.0.0
di IPv4.Untuk IPv6:
The
*
tanda setara dengan::
pada IPv6, seperti pada spesifikasi resmi .Alasannya adalah bahwa
curl
mencoba untuk menyelesaikanlocalhost
entri acak/etc/hosts
, dan seperti yang disebutkan @NickRetallack, entri tersebut adalah yang dipilihcurl
saat menyelesaikanlocalhost
dalam mode default-nya (diasumsikan IPv6 atau IPv4, apa pun yang diselesaikan terlebih dahulu).Memaksakannya dalam
--ipv4
mode, seperti yang disarankan @CharlesHebdough, akan membuatcurl
tekadlocalhost
untuk127.0.0.1
(dengan asumsi tidak ada entri IPv4 lain untuklocalhost
masuk/etc/hosts
).Setiap implementasi akan diselesaikan
localhost
sesuai keinginan, maka dari itu mengapa Anda memiliki kesuksesan yang terputus-putus dengan alat yang berbeda.Agar seakurat mungkin, gunakan
127.0.0.1
alih-alih localhost, tetapi itu akan mengikat Anda ke IPv4.localhost
memberi Anda fleksibilitas untuk bekerja di kedua protokol IPv6 dan IPv4, namun dalam beberapa implementasi Anda mungkin mengalami masalah, seperti dalam versi spesifik IPv6curl
.sumber