将cURL设置为使用本地虚拟主机

Xeo*_*oss 107 curl hosts

使用Apache或Ngnix我总是根据实际项目创建开发站点,例如http://project1.loc,在添加到我的.hosts文件后,浏览器使用没有问题.

但是,当我尝试向http://project1.loc/post.json同一个URL 发出一个cURL request()时,除了超时之外我什么也得不到.我假设cURL不关心我的自定义主机,直接进入名称服务器获取它的信息.

我怎样才能解决这个问题?

更新 我设置了一个自定义标题"HOST:http://project1.loc ",现在我得到了400个错误 - 但它们是瞬时的,所以我假设cURL至少使用了hosts文件......

Joh*_*art 393

实际上,curl有一个明确的选项: --resolve

代替 curl -H 'Host: yada.com' http://127.0.0.1/something

使用 curl --resolve 'yada.com:80:127.0.0.1' http://yada.com/something

你问的有什么区别?

其中,这适用于HTTPS.假设您的本地服务器具有证书yada.com,上面的第一个示例将失败,因为yada.com证书127.0.0.1与URL 中的主机名不匹配.

第二个示例适用于HTTPS.

从本质上讲,通过"主机"标题-H会将您的主机入侵到标头集,但绕过所有curl的主机特定情报.使用--resolve所有适用的常规逻辑,但只是假装DNS查找返回命令行选项中的数据.它的工作原理就像/etc/hosts应该.

注意--resolve需要一个端口号,因此对于您将使用的HTTPS

curl --resolve 'yada.com:443:127.0.0.1' https://yada.com/something

  • 这让我很难过 - 有人可以将此标记为正确的答案吗?它比答案要新得多,所以没有选票......但是接受的答案是错误的(即,只适用于某些情况)=( (26认同)
  • 值得注意的是--resolve仅在curl 7.21.3中添加 - 如果你被困在一个较旧的主机(例如Ubuntu 10.04 LTS)上,那么-H'Host ...'选项仍然是一个有用的后备. (10认同)
  • 虽然我同意这可能应该是接受的答案(如果OP改变它,我肯定不会冒犯,相反),说我的答案是错的是不对的:它对于当时可用的版本是正确的产生了问题和答案.SO用户如果不能阅读第一个答案,并根据他们的时间戳评估答案将无法获得最佳帮助...... (9认同)

Bru*_*uno 120

编辑:虽然这是目前接受的答案,但读者可能会发现用户John Hart的其他答案更适合他们的需求.根据用户Ken的说法,它使用了一个选项,该版本在版本7.21.3(2010年12月发布,即在此初始答案之后)中引入.


在您编辑的问题中,您使用URL作为主机名,而它只需要是主机名.

尝试:

curl -H 'Host: project1.loc' http://127.0.0.1/something
Run Code Online (Sandbox Code Playgroud)

这里project1.loc只是主机名,127.0.0.1是目标的IP地址.

(如果你使用curl从库中,而不是在命令行上,确保你没有把你http://Host头.)


eff*_*haa 5

为了在尚未通过 DNS 连接的 Apache http 服务器上设置虚拟主机,我喜欢使用:

curl -s --connect-to ::host-name: http://project1.loc/post.json
Run Code Online (Sandbox Code Playgroud)

其中主机名是运行 Web 服务器的计算机的 IP 地址或 DNS 名称。这也适用于 https 站点。