129

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

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

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

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

4

7 回答 7

478

实际上,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,上面的第一个示例将失败,因为证书与 URLyada.com中的主机名不匹配。127.0.0.1

第二个示例与 HTTPS 一起正常工作。

从本质上讲,通过传递“主机”标头-H确实会将您的主机破解到标头集中,但会绕过 curl 的所有特定于主机的智能。Using--resolve利用了所有适用的正常逻辑,但只是假装 DNS 查找在您的命令行选项中返回了数据。它就像/etc/hosts应该一样工作。

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

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

于 2012-04-18T21:43:21.400 回答
121

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


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

尝试:

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

whereproject1.loc只是主机名,127.0.0.1目标 IP 地址。

(如果您使用的是库中的 curl 而不是命令行,请确保您没有放入http://标题中Host。)

于 2010-08-11T12:51:41.523 回答
2

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

于 2010-08-02T18:20:12.387 回答
2

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

首先检查这个

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

我个人认为这有点过头了,看不出为什么主机文件不起作用。但它应该可以解决您遇到的问题。确保您也将正常的 DNS 服务器设置为转发器。

于 2010-08-10T00:24:20.360 回答
1

服务器是否真的收到了请求,并且您是否正确处理了主机名(别名)?

添加到我的 .hosts 文件后

检查您的网络服务器日志,看看请求是如何进来的......

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

- 痕迹

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

我会让 curl 请求在命令行上运行,然后尝试在 PHP 中实现。

配置选项是

-K/--配置

curl 中相关的选项在这里

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

      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/--config 指定从哪个配置文件读取 curl 参数。配置文件是一个文本文件,可以在其中写入命令行参数,然后将其用作实际命令行中的参数。选项及其参数必须在同一配置文件行中指定,由空格、冒号、等号或它们的任何组合分隔(但是,首选分隔符是等号)。如果参数要包含空格,则参数必须用引号引起来。在双引号内,可以使用以下转义序列:\、\"、\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.
于 2010-08-08T19:46:30.497 回答
1

提出请求

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
于 2010-08-11T15:40:23.637 回答
0

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

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

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

于 2020-05-07T10:43:22.313 回答