【问题标题】:Curl returns 400 bad request (url with spaces)Curl 返回 400 错误请求(带空格的 URL)
【发布时间】:2012-09-09 19:17:34
【问题描述】:

当我使用 curl 库并尝试从 url 获取图像时,我收到 400 bad request 错误。 我发现这个问题与编码网址有关。 但在我的情况下它不起作用,因为我的网址 - 它是服务器端图像的路径 - 就像

http://example.com/images/products/product 1.jpg

我知道名称文件中的用户空间是不好的做法,但它不是我的服务器,也不是我创建的那些文件。

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, urlencode($url));
echo $ret = curl_exec($ch);

当我使用 urlencode 函数时 - curl 返回 http_code = 0

更新

$url = str_replace(' ', '+', $url);

不起作用,服务器返回 404 错误。

【问题讨论】:

  • 这样的 URL 是可能的(带空格)。当我们在 URL 中输入空格时,空格变成%20
  • @diEcho 什么?当然有可能。它本身不会变成 %20 - 一些客户可以做到这一点,但肯定不是全部,而且总是不可能。

标签: php curl


【解决方案1】:

这可能有效吗?

$url = 'http://host/a b.img';
$url = str_replace(" ", '%20', $url);

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
echo $ret = curl_exec($ch);

【讨论】:

    【解决方案2】:

    你需要使用rawurlencode()函数:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, rawurlencode($url));
    echo $ret = curl_exec($ch);
    

    rawurlencode() 必须始终是首选。 urlencode() 仅保留用于传统用途。更多详情请查看this SO answer

    【讨论】:

      【解决方案3】:

      您不能对整个字符串进行 urlencode,因为这将对斜杠和其他您需要保持未编码的内容进行编码。如果空格是您唯一的问题,则可以这样做:

      str_replace(' ', '+', $url);
      

      【讨论】:

      • @yAnTar str_replace 之后的结果 URL 是什么?
      • 我会发布真正的 url,但 stackoverflow 上的解析器会剪切符号。我只发布了文件名真实文件名 - Michal Dziekan 016-thumb-600x791-188072.jpg 替换后 - Michal+Dziekan+016-thumb-600x791-188072.jpg
      • @techie_28 任何一个都应该工作,但%20 现在在技术上更正确。来试试吧。
      • 对我来说,'+' 工作正常,可能取决于服务器
      【解决方案4】:

      使用 curl 比其他方式面临更多挑战。只需使用 shell_exec

      $cmd = "curl -k -v -X POST 'https://serveraddress:8243/?foo=bar' -H 'Authorization: Basic cEZ.....h'";
      
      $result = shell_exec($cmd);         
      $output =  json_decode($result,true);
      print_r($output);           
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        • 2016-06-20
        • 1970-01-01
        • 1970-01-01
        • 2022-12-16
        • 2017-03-04
        • 1970-01-01
        相关资源
        最近更新 更多