用php中的本地代理替换whateverorigin.org调用

时间:2015-01-31 08:06:33

标签: javascript php json ssl cors

我目前在某些javascript中使用whateverorigin.org将URL检索为JSON对象,因为第三方网站尚未通过其JSON API提供其中一项功能。

我想从我的网站上删除这种依赖性,因为anyorigin.org打破了HTTPS / SSL浏览器对安全内容的检查,因为它是一个明确的http调用。

有人这样做过吗?我还没有在任何地方找到它的例子。

提前感谢您的回复!

1 个答案:

答案 0 :(得分:0)

好的,所以自从我第一次输入这个问题以来,我现在已经找到了一些例子,并在php中拼凑了一个工作代理功能...随意使用它来达到你自己的目的!

<?php
// Sourced from: http://stackoverflow.com/questions/2511410/curl-follow-location-error
function curl_exec_follow(/*resource*/ &$ch, /*int*/ $redirects = 20,     /*bool*/ $curlopt_header = false) {
    if ((!ini_get('open_basedir') && !ini_get('safe_mode')) || $redirects < 1) {
        curl_setopt($ch, CURLOPT_HEADER, $curlopt_header);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $redirects > 0);
        curl_setopt($ch, CURLOPT_MAXREDIRS, $redirects);
        return curl_exec($ch);
    } else {
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FORBID_REUSE, false);

        do {
            $data = curl_exec($ch);
            if (curl_errno($ch))
                break;
            $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            if ($code != 301 && $code != 302)
                break;
            $header_start = strpos($data, "\r\n")+2;
            $headers = substr($data, $header_start, strpos($data,"\r\n\r\n", $header_start)+2-$header_start);
            if (!preg_match("!\r\n(?:Location|URI): *(.*?) *\r\n!",$headers, $matches))
                break;
            curl_setopt($ch, CURLOPT_URL, $matches[1]);
        } while (--$redirects);
        if (!$redirects)
           trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING);
        if (!$curlopt_header)
            $data = substr($data, strpos($data, "\r\n\r\n")+4);
        return $data;
    }
}

header('Content-Type: application/json');
$retrieveurl = curl_init(urldecode($_GET['url']));
$callbackname = $_GET['callback'];

$htmldata = curl_exec_follow($retrieveurl);

if (curl_error($retrieveurl))
    die(curl_error($retrieveurl));

$status = curl_getinfo($retrieveurl, CURLINFO_HTTP_CODE);

curl_close($retrieveurl);

$data = array('contents' => $htmldata, 'status' => $status);

$jsonresult = json_encode($data);

echo $callbackname . '(' . $jsonresult . ')';

?>

希望这有助于某人!