【问题标题】:Why does a custom curl HEAD request hang for weebly.com?为什么 weebly.com 的自定义 curl HEAD 请求会挂起?
【发布时间】:2014-10-30 23:29:08
【问题描述】:

当我这样做时

$h = get_headers('http://www.weebly.com');

它工作得很好......该页面的标题会立即返回。

但如果我尝试使用 curl 通过显式 HEAD 请求检索标头...

 $url = 'http://www.weebly.com';
  $request_headers = array(
    'Connection: close',
  );
  $user_agent = 'curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15';
  $ch = curl_init($url);
  curl_setopt_array($ch, array(
    CURLOPT_CUSTOMREQUEST => 'HEAD',
    CURLOPT_HEADER => TRUE,
    CURLOPT_HTTPHEADER => $request_headers,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_FOLLOWLOCATION => TRUE,
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_USERAGENT => $user_agent,
  ));

  $result = curl_exec($ch);

请求没有完成。

我的 CURL 设置有什么问题?这适用于 http://www.google.com 的其他网站,但对于一些像 weebly 这样的网站,它最终会挂起。

【问题讨论】:

  • “相同的 HEAD 请求”是什么意思? doc 声明 默认情况下 get_headers 使用 GET 请求来获取标头。

标签: php curl http-headers request libcurl


【解决方案1】:

因为 libcurl 的行为就像使用 GET 一样,但是您仅在对 HEAD 的实际请求中更改方法,并且由于 HEAD 响应可能具有 Content-Length: 标头但没有响应正文,因此搞砸了。

让 libcurl 执行 HEAD 并期待 HEAD 响应的“正确”方法是改用 CURLOPT_NOBODY

CURLOPT_CUSTOMREQUEST 只能用于改变方法关键字,不能改变行为。

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2019-08-23
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多