【问题标题】:PHP Curl - 400 Bad RequestPHP Curl - 400 错误请求
【发布时间】:2017-03-04 18:12:41
【问题描述】:

我知道这是使用 Curl 时的常见问题,但在查看 StackOverflow 和 Google 后我没有找到解决方案。

我尝试了不同的用户代理,但遇到了不同的错误:

  • 请求的 URL 返回错误:400 Bad Requestresource(19) of type (Unknown)
  • 请求的 URL 返回错误:400 Bad Requeststring(42) of type (Unknown)(我注意到 42 指的是 $target_url 中的 '=')

取决于我对下面的代码所做的一些修改,但是没有人指出我解决这个问题的方向。

感谢任何建议:

$target_url = "http://www.hockeydb.com/ihdb/stats/pdisplay.php?pid=170307";

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)');
    curl_setopt($ch, CURLOPT_URL,$target_url);
    curl_setopt($ch, CURLOPT_FAILONERROR, true);
    //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $html = curl_exec($ch);
    if ($html === false) $html = curl_error($ch);
    echo stripslashes($html);
    curl_close($ch);

    var_dump($ch);

*** 我应该注意我实际上是从文件中读取 url(和其他一些),所以也许 url 的格式有问题? 我以前做过这个并且没有问题,但现在我很难过。 我读取了每一行/url,并将其放入一个数组中,稍后循环遍历。

*** 如果我对 url 进行硬编码,那么它可以正常工作,但由于某种原因,从文件中读取它会产生错误。

【问题讨论】:

  • 我们可以在这里提供一些帮助。您必须将工作请求(可能使用某些浏览器完成)与您发送的请求进行比较。最好使用网络嗅探器,以便两个请求的显示相同。 wireshark 是一个易于使用的。
  • 这很奇怪,我在沙盒上尝试了您的代码并且它有效
  • 无论如何尝试包含 Accept 标头(编码和语言)
  • 我也在沙箱上尝试过它并且它可以工作,但是当它上传到我的服务器时它不会。我在上面添加了一条注释,我正在从 *.txt 文件中读取 url。

标签: php curl


【解决方案1】:

不要使用stripslashes() 使用preg_replace() 过滤网址

<?php
$target_url="http://www.hockeydb.com/ihdb/stats/pdisplay.php?pid=170307";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,4); 
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

$html = curl_exec($ch);

$html = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)  ([\"'>]+)#",'$1'.$target_url.'$2$3', $html);
echo $html;

curl_close($ch);
var_dump($ch);
?>

【讨论】:

  • 'stripslashes()' 函数(或 preg_replace())仅用于调试目的。但是,$html 返回为“假”。
  • 问题实际上与从文件中读取内容有关,而不是 curl。显然,每一行都在字符串的末尾附加了一个换行符,考虑到我没有对从文件中读取它的 php 进行任何更改,这很奇怪。
猜你喜欢
  • 2014-03-05
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
相关资源
最近更新 更多