REST API可以在浏览器中和通过AJAX工作,但通过cURL失败

时间:2017-12-04 作者:asprin

我正在使用WordPress REST API获取页面内容。我使用的URL是:

https://sitename.org/wp-json/wp/v2/pages/4322

当我在浏览器中打开那个URL时,我得到的是有效的响应。

但当我尝试通过cURL使用相同的URL时,我得到:

无法连接到主机

我使用的代码是:

$page_id = 4322;
$wp_api_url = "https://sitename.org/wp-json/wp/v2/pages/".$page_id;             
$ch = curl_init();          
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $wp_api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);         
curl_setopt($ch, CURLOPT_TIMEOUT, 10);                      
$response = curl_exec($ch); 

if (FALSE === $response)
{       
    echo curl_error($ch); // <---- failing here
}
else
{
    echo \'<pre>\';
    print_r(json_decode($response, true));
    echo \'</pre>\';
}
curl_close($ch);
这就引出了一个问题:

那么为什么它可以通过浏览器工作呢

2 个回复
SO网友:Asuka165

看来我提这个问题已经很晚了,但我还是把我的经验发到这里,希望它能帮助任何有类似经验的人,因为很难用谷歌搜索出这种罕见情况的答案。

我有一个非常相似的问题。我通过浏览器和AJAX进行了测试,它们都可以,但当我用PHP cURL发送请求时,连接超时。

但我的情况有点不同。我有2台服务器,服务器A是API的主机,服务器B是请求服务器。

服务器B是我的生产服务器,人们一直在使用它,没有任何问题,直到有一天,我从服务器A收到连接超时错误。

然后,我发现,服务器A防火墙将服务器B列入黑名单,因为服务器B试图执行SQL注入。(这就是为什么浏览器和AJAX没有被服务器A阻止的原因,因为您是从PC而不是通过服务器发送请求)So, I solved my problem by whitelisting Server B in Server A.

但故事还没有结束。服务器A黑名单服务器B的原因是因为我的一个用户通过API输入了一大块段落,其中包含单词;select“编辑”;(是的selected, 不select 单独)和“;from"E;,出于某种原因,服务器A将其标记为SQL注入。听起来很奇怪,但我想服务器的ModSecurity太敏感了。

SO网友:Drupalizeme

您可以使用以下代码,并且应该可以工作,如果不能,我们应该查看服务器配置以了解原因。此外,我们还可以检查curl\\u错误以获取提示。

$curl = curl_init();
$page_id = 4322;
$wp_api_url = "https://sitename.org/wp-json/wp/v2/pages/".$page_id;     
curl_setopt_array($curl, array(
  CURLOPT_URL => $wp_api_url,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

结束

相关推荐

在Example.com/Latest上显示所有最新的帖子,并带有filve.php

我想为最新的帖子制定一个重写规则example.com/latest 通过rewrite_rules_array-筛选并显示带有archive.php. 通常这是example.com/index.php 我想是吧?但我用我的主题index.php 用于自定义索引页。index.php?category_name=technik 已成功从中获取输出archive.php, 但是我如何从archive.php 没有任何额外的过滤?add_filter(\"rewrite_rules_array\", fun