【问题标题】:Why does this CURL work in PHP but not in the shell为什么这个 CURL 在 PHP 中有效但在 shell 中无效
【发布时间】:2014-09-12 15:49:21
【问题描述】:

我正在尝试访问 API。我可以从 PHP 做到这一点

<?php

$url = 'http://apiurl/path';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('API-KEY: myKey'));
//curl_setopt($ch, CURLOPT_POST, 1);

$output = curl_exec($ch);
$curlInfo = curl_getinfo($ch);
curl_close($ch);
echo $output; /*success!*/

但是,从命令行执行此操作会触发 403 错误。

curl -i -v -H "API-KEY: myKey" http://apiurl/path
/*failure!*/

PHP 有何不同之处?还是我的命令行代码中有语法错误?

【问题讨论】:

  • 您是否在同一台服务器上运行这些? API 服务器是否检查 User-Agent 标头?您是否尝试过使用日志代理服务器之类的东西来比较请求? (比如说Charles,还是Burp?)
  • 据我所见,您做的事情是正确的——但命令行 Curl 可能会发送 User-Agent,而我的 php 安装不会。这是唯一的区别。尝试添加-H "User-Agent: 以删除用户代理,看看它是否有所作为。 (您的 API 密钥中可能有一些字符在命令行上被不同的解释?)
  • @mattgibson 是的,同一台服务器。我可以在命令行上禁用用户代理吗?使它们完全相同。
  • 是的;添加-H "User-Agent:" — 类似于您对“API-KEY”所做的操作,但如果您不提供任何值,则应删除标题。
  • @MattGibson 抱歉,我没有看到您已经提供了用户代理重置。您能否将其作为答案提交,以便我接受?谢谢!

标签: php linux shell curl


【解决方案1】:

我能看到的唯一明显区别是命令行 PHP 默认添加了一个 User-Agent 标头。您使用的 API 服务器可能拒绝来自 Curl 用户代理的请求?尝试通过添加参数-H "User-Agent:"从命令行中删除它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 2011-03-12
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2019-11-01
    相关资源
    最近更新 更多