设置 open_basedir 时无法使用 cURL 跟踪位置 (URL) - API 回调失败 [英] Unable to follow a location (URL) using cURL when open_basedir is set - API callback failing

查看:15
本文介绍了设置 open_basedir 时无法使用 cURL 跟踪位置 (URL) - API 回调失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

将值发布到 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_modeOnopen_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆