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

通过使用 Apache 或 Nnix,我总是根据实际项目创建开发站点,比如 http://project1.loc,在添加到我的 .hosts文件后,浏览器使用它们没有任何问题。

但是,当我尝试对同一个 URL 发出 cURL 请求(http://project1.loc/post.json)时,除了超时之外,我从来没有得到过任何东西。我假设 cURL 不关心我的自定义主机,而是直接去名称服务器获取它的信息。

我该怎么补救?

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

164421 次浏览

要么使用指向 127.0.0.1的真正的完全限定域名(如 dev.yourdomain.com) ,要么尝试编辑适当的主机文件(通常是在 * nix 环境中的/etc/hosts)。

服务器是否实际获得了请求,您是否正确地处理了主机名(别名) ?

在添加到我的. hosts 文件之后

检查你的网络服务器日志,看看请求是怎么来的..。

Curl 具有转储发送的请求和接收的响应的选项,它被称为跟踪,将被保存到一个文件中。

痕迹

如果您缺少主机或头信息-您可以使用配置选项强制这些头信息。

我将在命令行上获得 curl 请求,然后尝试用 PHP 实现。

配置选项是

- K/-配置

与旋度相关的选项在这里

痕迹 启用所有传入和传出数据(包括描述性信息)到给定输出文件的完整跟踪转储。使用“-”作为文件名将输出发送到 stdout。

      This option overrides previous uses of -v/--verbose or --trace-ascii.


If this option is used several times, the last one will be used.

- K/-配置 指定从哪个配置文件读取 curl 参数。配置文件是一个文本文件,可以在其中写入命令行参数,然后将使用这些参数,就好像它们是写在实际的 命令行。选项及其参数必须在同一个配置文件行上指定,用空格、冒号、等于号或它们的任何组合(但是,首选的分隔符是- Tor 是等号)。如果参数包含空格,则参数必须用引号括起来。在双引号中,可以使用以下转义序列: ,”,t,n, R 和 v。忽略任何其他字母前面的反斜杠。如果配置行的第一列是“ #”字符,则该行的其余部分将被视为注释。每个只写一个选项 配置文件中的物理行。

      Specify the filename to -K/--config as '-' to make curl read the file from stdin.


Note that to be able to specify a URL in the config file, you need to specify it using the --url option, and not by simply writing the URL on its own line. So, it could look similar to this:


url = "http://curl.haxx.se/docs/"


Long option names can optionally be given in the config file without the initial double dashes.


When curl is invoked, it always (unless -q is used) checks for a default config file and uses it if found. The default config file is checked for in the following places in this order:


1) curl tries to find the "home dir": It first checks for the CURL_HOME and then the HOME environment variables. Failing that, it uses getpwuid() on UNIX-like systems (which  returns  the  home  dir
given the current user in your system). On Windows, it then checks for the APPDATA variable, or as a last resort the '%USERPROFILE%\Application Data'.


2)  On windows, if there is no _curlrc file in the home dir, it checks for one in the same dir the curl executable is placed. On UNIX-like systems, it will simply try to load .curlrc from the deter-
mined home dir.


# --- Example file ---
# this is a comment
url = "curl.haxx.se"
output = "curlhere.html"
user-agent = "superagent/1.0"


# and fetch another URL too
url = "curl.haxx.se/docs/manpage.html"
-O
referer = "http://nowhereatall.com/"
# --- End of example file ---


This option can be used multiple times to load multiple config files.

这似乎并不是一个罕见的问题。

先检查 这个

如果这没有帮助,您可以在 Windows 上安装本地 DNS 服务器,如 这个。将 Windows 配置为使用本地主机作为 DNS 服务器。这个服务器可以配置为对任何您需要的假域名具有权威性,并且可以将请求转发到真正的 DNS 服务器以处理所有其他请求。

我个人认为这有点过头了,我不明白为什么主机文件不能工作。但这应该能解决你的问题。请确保您也将正常的 DNS 服务器设置为转发器。

编辑: 虽然这是目前公认的答案,读者可能会发现用户 约翰 · 哈特另一个答案更适合他们的需要。它使用了一个选项,根据用户 ,是在7.21.3版本中引入的(也就是 于2010年12月公布,即在这个初始答案之后)。


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

试试:

curl -H 'Host: project1.loc' http://127.0.0.1/something

其中 project1.loc是主机名 只是127.0.0.1是目标 IP 地址。

(如果您使用的是库中的 curl 而不是命令行中的 curl,请确保不要将 http://放在 Host标头中。)

向... 提出请求

C:\wnmp\curl>curl.exe --trace-ascii -H 'project1.loc' -d "uuid=d99a49d846d5ae570
667a00825373a7b5ae8e8e2" http://project1.loc/Users/getSettings.xml

产生的 -H日志文件包含:

== Info: Could not resolve host: 'project1.loc'; Host not found
== Info: Closing connection #0
== Info: About to connect() to project1.loc port 80 (#0)
== Info:   Trying 127.0.0.1... == Info: connected
== Info: Connected to project1.loc (127.0.0.1) port 80 (#0)
=> Send header, 230 bytes (0xe6)
0000: POST /Users/getSettings.xml HTTP/1.1
0026: User-Agent: curl/7.19.5 (i586-pc-mingw32msvc) libcurl/7.19.5 Ope
0066: nSSL/1.0.0a zlib/1.2.3
007e: Host: project1.loc
0092: Accept: */*
009f: Content-Length: 45
00b3: Content-Type: application/x-www-form-urlencoded
00e4:
=> Send data, 45 bytes (0x2d)
0000: uuid=d99a49d846d5ae570667a00825373a7b5ae8e8e2
<= Recv header, 24 bytes (0x18)
0000: HTTP/1.1 403 Forbidden
<= Recv header, 22 bytes (0x16)
0000: Server: nginx/0.7.66
<= Recv header, 37 bytes (0x25)
0000: Date: Wed, 11 Aug 2010 15:37:06 GMT
<= Recv header, 25 bytes (0x19)
0000: Content-Type: text/html
<= Recv header, 28 bytes (0x1c)
0000: Transfer-Encoding: chunked
<= Recv header, 24 bytes (0x18)
0000: Connection: keep-alive
<= Recv header, 25 bytes (0x19)
0000: X-Powered-By: PHP/5.3.2
<= Recv header, 56 bytes (0x38)
0000: Set-Cookie: SESSION=m9j6caghb223uubiddolec2005; path=/
<= Recv header, 57 bytes (0x39)
0000: P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
<= Recv header, 2 bytes (0x2)
0000:
<= Recv data, 118 bytes (0x76)
0000: 6b
0004: <html><head><title>HTTP/1.1 403 Forbidden</title></head><body><h
0044: 1>HTTP/1.1 403 Forbidden</h1></body></html>
0071: 0
0074:
== Info: Connection #0 to host project1.loc left intact
== Info: Closing connection #0

我的接待员文件是这样的:

# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host


127.0.0.1       localhost
...
...
127.0.0.1   project1.loc

实际上,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证书与 URL 中的 127.0.0.1主机名不匹配。

第二个示例可以正确地使用 HTTPS。

实际上,通过 -H传递一个“ Host”头文件确实可以让 Host 进入头文件集,但是会绕过 curl 的所有特定于主机的智能。使用 --resolve利用了所有应用的常规逻辑,但只是假设 DNS 查找返回了命令行选项中的数据。它的工作原理和 /etc/hosts一样。

注意,--resolve接受一个端口号,因此对于 HTTPS,您将使用

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

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

curl -s --connect-to ::host-name: http://project1.loc/post.json

其中 host-name 是运行 Web 服务器的机器的 IP 地址或 DNS 名称。 这对 https-Site 也很有效。