设置 open_basedir 时无法使用 cURL 跟踪位置 (URL) - API 回调失败 [英] Unable to follow a location (URL) using cURL when open_basedir is set - API callback failing
问题描述
将值发布到 API 的现有方法
根据 API 文档,必须将表单与一些输入字段和客户令牌字段一起发布到 API URL(method="POST" 和 action="API_URL").API 处理然后将响应发布到我服务器上的 callback.php 文件(已修复 - 无法更改).该页面重定向到 API URL,然后返回到 callback.php.我可以使用该文件中的 $_POST
访问发布的 val.这就是现有方法的全部内容,而且效果很好.
Existing method of posting values to API
As per the API documentation, a form has to be posted to the API URL (method="POST" and action="API_URL") with some input fields and a customer token field. The API processes and then posts response to a callback.php file on my server (fixed - can't change it). The page redirects to the API URL and then comes back to callback.php. I can access the posted vals using $_POST
in that file. That's all about the existing method and it works fine.
用于隐藏客户令牌的服务器端帖子
出于安全原因,我这次尝试从服务器端发布.
Server side post to hide the customer token
For security reasons, I am trying to post from server side this time.
问题
回调未发生(callback.php 文件中的代码未执行).
The Problem
Callback is not happening (code inside callback.php file not executing).
在努力使用 cURL 发布到 API 并接收回调之后,我意识到由于 CURLOPT_FOLLOWLOCATION
在我的服务器中设置了 open_basedir.我发现以下代码似乎能够完成发布,即使 safe_mode
是 On
或 open_basedir
已设置,前提是
After sturggling hard with cURL to post to the API and receive callback, I realized that open_basedir is set in my server due to which CURLOPT_FOLLOWLOCATION
. I found the following code which seems to be able to accomplish the posting even if safe_mode
is On
or open_basedir
is set, provided that
我们通常知道我们会在哪里重定向到
we know generally where we'll be redirected to
请仔细阅读下面的代码并告诉我这里是什么意思,如果我们知道我们通常会被重定向到哪里
.它是处理完成后 API 将重定向到的 URL 吗?然后是的,我知道,它必须将回调发送到我服务器上的 callback.php 文件,但这并没有发生.:-
Please go through the code below and tell me what is meant here by if we know generally where we'll be redirected to
. Is it the URL where the API will redirect to after the processing completes? Then yes I know, it has to send callback to a callback.php file on my server, but that is not happening.
:-
function curl($url, $postVars)
{
$go = curl_init($url);
curl_setopt ($go, CURLOPT_URL, $url);
curl_setopt($go, CURLOPT_VERBOSE, 1);
//follow on location problems
if (ini_get('open_basedir') == '' && (ini_get('safe_mode')== 'Off'))
{
curl_setopt ($go, CURLOPT_FOLLOWLOCATION, $l);
$syn = curl_exec($go);
if(curl_error($go))
return false;
}
else
$syn = curl_redir_exec($go, $postVars);
curl_close($go);
return $syn;
}
function curl_redir_exec($ch, $postVars)
{
static $curl_loops = 0;
static $curl_max_loops = 20;
if ($curl_loops++>= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postVars);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$data = curl_exec($ch);
if(curl_error($ch))
return false;
list($header, $data) = explode("\n\r", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$redirect_page = "[0-9]*.html";
$base_redirect = "http://example.com/";
if ($http_code == 301 || $http_code == 302)
{
$matches = array();
$pregs = eregi($redirect_page, $data, $matches);
$new_url = $base_redirect . $matches[0];
if (!$new_url)
{
//couldn't process the url to redirect to
$curl_loops = 0;
return $data;
}
curl_setopt($ch, CURLOPT_URL, $new_url);
return curl_redir_exec($ch, $postVars);
}
else
{
$curl_loops=0;
return $data;
}
}
在运行代码时,它进入了 $http_code
既不是 301
也不是 302
(它是 200
在我的情况下).并打印 $data 给出以下内容:-
On running the code, it enters into the conditon where $http_code
is neither 301
nor 302
(it is 200
in my case). And printing the $data gives the following:-
HTTP/1.1 200 OK Date: Wed, 01 Sep 2010 10:02:44 GMT Server: Apache/2 X-Powered-By: PHP/5.2.11 Content-Length: 0 Connection: close Content-Type: text/html
帮助
帮帮我吧..
需要对此进行任何代码更改吗?
cURL 在我的情况下不起作用吗?(它是一个异步 API - 它在完成时触发回调.原始请求在这种设置中不会收到返回值.)
Help
Help me guys..
Any code changes to this needed?
Will cURL not work in my case? (it is an asynchronous API - it triggers the callback when it's done. The original request does not receive a return value in this kind of setup.)
谢谢桑迪潘
推荐答案
您应该检查 cURL 请求的 URL (echo $new_url;)
You should check what the URL was cURL requested (echo $new_url;)
这篇关于设置 open_basedir 时无法使用 cURL 跟踪位置 (URL) - API 回调失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!