0

「open_basedir」が設定されている共有サーバーでホストしている Web サイトに問題があります...そのため、クレジット システムはエラーをスローし、購入者のクレジット カードに請求しません。

エラーメッセージ

警告: curl_setopt() [function.curl-setopt]: safe_mode または open_basedir が設定されている場合、CURLOPT_FOLLOWLOCATION を有効にできません

コード

function http_post($method, $server, $port, $url, $vars) {

$postdata = "";
foreach($vars as $key => $value) {
    $postdata .= urlencode($key) . "=" . urlencode($value) . "&";
}

$postdata = substr($postdata,0,-1);
$content_length = strlen($postdata);

$headers = "POST $url HTTP/1.1\r\n".
    "Accept: */*\r\n".
    "Accept-Language: en-nz\r\n".
    "Content-Type: application/x-www-form-urlencoded\r\n".
    "Host: $server\r\n".
    "Connection: Keep-Alive\r\n".
    "Cache-Control: no-cache\r\n".
    "Content-Length: $content_length\r\n\r\n";

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $method . '://' . $server .":". $port . $url);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);

$ret = curl_exec($ch);
curl_close($ch);
return $ret;
}

ルート PHP.ini にアクセスせずに、ホストを切り替えることなく、とにかくこれを回避する方法はありますか? ありがとうございました。

4

1 に答える 1

0

open_basedirinの値をオーバーライドする方法はありませんphp.ini。これは目的に反するからです。CURLOPT_FOLLOWLOCATION別の方法は、設定されていない場合と同じ機能を実行する独自の関数を作成することopen_basedirです。http://php.benscom.com/manual/en/function.curl-setopt.php#102121から見つかったこのコードのバリエーションを使用しました。これは、リクエストをループしLocation:、次のように応答ヘッダーで正規表現一致を行います新しいリクエストで必要:

function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) { 
    $mr = $maxredirect === null ? 5 : intval($maxredirect); 
    if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) { 
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0); 
        curl_setopt($ch, CURLOPT_MAXREDIRS, $mr); 
    } else { 
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
        if ($mr > 0) { 
            $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 

            $rch = curl_copy_handle($ch); 
            curl_setopt($rch, CURLOPT_HEADER, true); 
            curl_setopt($rch, CURLOPT_NOBODY, true); 
            curl_setopt($rch, CURLOPT_FORBID_REUSE, false); 
            curl_setopt($rch, CURLOPT_RETURNTRANSFER, true); 
            do { 
                curl_setopt($rch, CURLOPT_URL, $newurl); 
                $header = curl_exec($rch); 
                if (curl_errno($rch)) { 
                    $code = 0; 
                } else { 
                    $code = curl_getinfo($rch, CURLINFO_HTTP_CODE); 
                    if ($code == 301 || $code == 302) { 
                        preg_match('/Location:(.*?)\n/', $header, $matches); 
                        $newurl = trim(array_pop($matches)); 
                    } else { 
                        $code = 0; 
                    } 
                } 
            } while ($code && --$mr); 
            curl_close($rch); 
            if (!$mr) { 
                if ($maxredirect === null) { 
                    trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING); 
                } else { 
                    $maxredirect = 0; 
                } 
                return false; 
            } 
            curl_setopt($ch, CURLOPT_URL, $newurl); 
        } 
    } 
    return curl_exec($ch); 
} 
于 2012-10-25T02:03:49.887 に答える