Невозможно следить за местоположением (URL) с помощью cURL, когда установлен open_basedir - сбой обратного вызова API

Существующий метод отправки значений в API
Согласно документации API, форма должна быть отправлена ​​по URL-адресу API (method = "POST" и action = "API_URL") с некоторыми полями ввода. и поле токена клиента. API обрабатывает, а затем отправляет ответ на файл callback.php на моем сервере (исправлено - изменить его нельзя). Страница перенаправляется на URL-адрес API, а затем возвращается на callback.php. Я могу получить доступ к опубликованным вальсам, используя $_POST в этом файле. Это все о существующем методе, и он отлично работает.

Сообщение на стороне сервера, чтобы скрыть токен клиента
В целях безопасности на этот раз я пытаюсь отправить сообщение на стороне сервера.

Проблема
Обратного вызова не происходит (код внутри файла callback.php не выполняется).

После того, как я упорно работал с cURL для публикации в API и получения обратного вызова, я понял, что на моем сервере установлен open_basedir, из-за чего CURLOPT_FOLLOWLOCATION. Я нашел следующий код, который, кажется, может выполнить публикацию, даже если safe_mode On или open_basedir установлен, при условии, что

мы обычно знаем, куда нас перенаправят

Просмотрите приведенный ниже код и скажите, что здесь означает if we know generally where we'll be redirected to. Это URL-адрес, на который API будет перенаправлять после завершения обработки? Тогда да, я знаю, он должен отправить обратный вызов файлу callback.php на моем сервере, но этого не происходит. : -

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 дает следующее: -

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 - он запускает обратный вызов, когда он выполняется. Исходный запрос не получает возвращаемого значения при такой настройке.)

Спасибо Сандипан


person Sandeepan Nath    schedule 01.09.2010    source источник
comment
Если кто-нибудь может помочь мне другим методом, кроме cURL, ответьте на мой вопрос stackoverflow.com/questions/3609157/   -  person Sandeepan Nath    schedule 01.09.2010


Ответы (1)


Вы должны проверить, какой URL-адрес был запрошен cURL (echo $ new_url;)

person Simon    schedule 19.10.2010