PHP 中的 curl 与 curl 命令行


Curl in PHP vs Curl Command Line

所以,我有一个PHP脚本,它用curl调用REST API。 网址基本上看起来像这样:

https://firewall1/api/?type=config&action=set&xpath=/config/devices/entry[@name='localhost.localdomain']/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='RULENAME']&element=<disabled>no</disabled>&key=APIKEY
响应返回为

成功,但实际上并没有在防火墙中进行更改,这似乎很奇怪。 如果我使用命令行 curl 获取并运行相同的 URL,它会按预期工作。

curl -v -k -g "https://firewall1/api/?type=config&action=set&xpath=/config/devices/entry[@name='localhost.localdomain']/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='RuleName']&element=<disabled>no</disabled>&key=APIKEY"

我的卷发设置如下所示:

$failover1 = curl_init($enableFailover1);
$failback1 = curl_init($disableFailover1);
$commit1 = curl_init($commitFW1);
//set curl options
curl_setopt_array($failover1, array(
        CURLOPT_SSL_VERIFYHOST => 0,
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_POST => TRUE,
        CURLOPT_RETURNTRANSFER => TRUE
));
$responseFail1 = curl_exec($failover1);
$responseBack1 = curl_exec($failback1);
$responseCommit1 = curl_exec($commit1);
//failover and take approprate action for errors
if($responseFail1 === FALSE) {
        die(curl_error($failover1));
} else {
      //do some stuff
}

运行 PHP 脚本返回与 curl 命令行相同的响应,但结果不同。 是否有一些我没有传递的标题或我应该做些什么来使其正常工作? 我还应该补充一点,如果我获取 URL 并粘贴到浏览器中并将命令传递给shell_exec,它就可以工作。 感谢您的帮助!

来自 curl 命令行的响应:

* Connection #0 to host firewall1 left intact
<response status="success" code="20"><msg>command succeeded</msg></response>

来自 PHP 脚本中 curl 的响应:

<response status="success" code="20"><msg>command succeeded</msg></response>

看起来您省略了 PHP 调用中-g的选项。正如我从手册中看到的以下描述:

"当使用这种样式时,必须给出 -g 选项以阻止 curl 将方括号解释为特殊的通配字符。 也可以使用链接本地和站点本地地址(包括作用域标识符,例如 fe80::1234%1),但作用域部分必须是数字或与 Linux 上的现有网络接口匹配,并且百分比字符必须进行 URL 转义。SFTP URL 中的前面示例可能看起来像:sftp://[fe80::1234%251]/"

https://curl.haxx.se/docs/manual.html

更好的选择是使用 PHP shell 脚本执行函数调用整个 URL 字符串,shell_exec()在您的情况下。PHP curl 是一个用于使用 PHP curl 的包装库,PHP curl 库可能不支持的选项可能很少-g例如在命令行中可用的选项。