Ruby on rails cURL无法连接到localhost,但浏览器可以

Ruby on rails cURL无法连接到localhost,但浏览器可以,ruby-on-rails,curl,osx-mavericks,thin,Ruby On Rails,Curl,Osx Mavericks,Thin,我在本地运行Rails应用程序(瘦服务器),我可以从浏览器(localhost:3000)进行本地连接,但是当我尝试使用curl时,我得到: curl -H 'id:1' -i 'http://localhost:3000/api/data' -v * Hostname was NOT found in DNS cache * Trying ::1... * Adding handle: conn: 0x7fd121808200 * Adding handle: send: 0 * Add

我在本地运行Rails应用程序(瘦服务器),我可以从浏览器(localhost:3000)进行本地连接,但是当我尝试使用curl时,我得到:

curl -H 'id:1' -i 'http://localhost:3000/api/data' -v

* Hostname was NOT found in DNS cache
*   Trying ::1...
* Adding handle: conn: 0x7fd121808200
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7fd121808200) send_pipe: 1, recv_pipe: 0
* Connection failed
* connect to ::1 port 3000 failed: Connection refused
*   Trying fe80::1...
* Connection failed
* connect to fe80::1 port 3000 failed: Connection refused
* Failed to connect to localhost port 3000: Connection refused
* Closing connection 0
curl: (7) Failed to connect to localhost port 3000: Connection refused

这曾经工作得很好,但我最近更新了Mavericks,我怀疑它可能破坏了一些东西。我还可以从web上成功地卷曲。

假设您没有接触/etc/hosts,并且scutil报告是肯定的:

$ scutil -r 127.0.0.1
Reachable,Local Address
$ scutil -r localhost
Reachable,Local Address
那么我猜防火墙是活动的,不接受来自curl的连接

尝试在首选项-->安全-->防火墙备选方案-->加号-->(serach代表curl并添加它)下将curl添加到接受的应用程序列表中(我猜是语言备选方案,因为我的机器设置为使用瑞典语)

注意:确保添加了壳中实际使用的卷曲

$ type -a curl
curl is /opt/local/bin/curl
curl is /usr/bin/curl
这是一个(),如果/etc/hosts中有一个IPv6条目没有响应,curl将无法返回到IPv4

您可以通过
-4
选项强制它使用IPv4。

而不是

curl localhost:3000
试一试

它起作用了。
如果没有,请在启动rails服务器时检查输出:

=> Booting WEBrick
=> Rails 3.2.13 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2014-10-28 15:30:08] INFO  WEBrick 1.3.1
[2014-10-28 15:30:08] INFO  ruby 2.0.0 (2014-02-24) [x86_64-darwin12.5.0]
[2014-10-28 15:30:08] INFO  WEBrick::HTTPServer#start: pid=4004 port=3000

使用第2行末尾的url,而不是
ENV['HOST']

此问题的另一个原因可能是具有代理地址的系统配置不当。跑

export http_proxy=

然后重新运行curl命令,以消除这一影响因素。它为我解决了这个问题。

您是否支持代理?然后使用下面的命令完全绕过代理

curl -x "" "http://127.0.0.1:3000"

重新启动计算机有时可以修复奇怪的连接问题。我不知道为什么。

你能试试
http://127.0.0.1:3000/api/data
?似乎出于某种原因,curl直接转到了ipv6…谢谢,这似乎有效。知道为什么会突然出现这种情况吗?我不是mac用户,但我认为localhost的条目可能已经从/etc/hosts中消失了(应该有一行类似于
127.0.0.1 localhost
的代码,将名称localhost链接到环回地址127.0.0.1。如果有这一行,则resolv.conf或mac用于决定是否查阅主机文件和/或dns以及查阅顺序的任何确认文件可能有问题。查看此处,如运行
dscacheutil-flushcache
可能是您需要做的事情(假设/etc/hosts正常)将-4添加到命令中:curl-4-H'id:1'-i'-vIt似乎是IPv6问题。如果我注释掉“fe80::1%lo0 localhost”在我的/etc/hosts文件中,curl工作正常。我有两台Mac电脑,都是Yosemite,但其中只有一台有这个条目。有人能评论一下为什么一台主机会有一个本地主机的IPv6条目吗?另一个关于IPv6环回的报告导致了一个问题:。感谢Steve,+1链接到bug report有可能在php中通过
curl\u setopt
进行设置吗?为什么它与
0.0.0:3000
一起工作,而不与
localhost:3000
一起工作?
curl -x "" "http://127.0.0.1:3000"