使用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
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
头.)
为了在尚未通过 DNS 连接的 Apache http 服务器上设置虚拟主机,我喜欢使用:
curl -s --connect-to ::host-name: http://project1.loc/post.json
Run Code Online (Sandbox Code Playgroud)
其中主机名是运行 Web 服务器的计算机的 IP 地址或 DNS 名称。这也适用于 https 站点。