<?php

/**

* ajax proxy

* ajax跨域解决办法

* @author  suconghou <suconghou@126.com>

* @version v1.1

* @blog http://blog.suconghou.cn

* @update 2014.2.26

* @ 修正了get时忽略了端口号的问题

*/

class ajax

{

private $url; ///真实的ajax地址

private $get;

private $post;

private $get_string;

private $post_string;

private $result;

function __construct()

    {

        isset($_REQUEST['url'])||exit('no available url');

$this-> url=$_REQUEST['url'];

foreach ($_GET as $key => $value)

        {

if($key=='url')continue;

$this-> get[$key]=$value;

        }

foreach ($_POST as $key => $value)

        {

if($key=='url')continue;       

$this-> post[$key]=$value;

        }

if(!empty($this-> get))

        {

$this-> get_string=$this->implode_with_key($this-> get);

        }

if(!empty($this-> post))

        {

$this-> post_string=$this->implode_with_key($this-> post);

        }

//$this-> debug();

$this-> ajax();

    }

function debug($debug=1)

    {

            var_dump($this-> get);

            var_dump($this-> post);

            var_dump($this-> get_string);

    }

function ajax()

    {

if (empty($this-> post))///没有post数据,但可能有get

        {

$this->get();

        }

else //可能有post,有get

        {

$this->post();

        }

echo $this-> result;

    }

///三种版本的post,get,优先使用curl

function post()

    {

if (extension_loaded('curl'))

        {  

$url=$this->query_string();

$ch=curl_init();

            curl_setopt_array($ch, array(CURLOPT_URL=>$url,CURLOPT_RETURNTRANSFER=>1,CURLOPT_POST=>1,CURLOPT_POSTFIELDS=>$this-> post_string));

$this-> result=curl_exec($ch);

            curl_close($ch);

        }

else if(function_exists('fsockopen'))

        {

$parts = parse_url($this-> url);

$fp= fsockopen($parts['host'],isset($parts['port']) ? $parts['port'] : 80,$errno, $errstr,10);

if (!$fp) die("$errstr($errno)");

$url=$this->query_string(1);

$out='POST '.$url."\r\nContent-type: application/x-www-form-urlencoded\r\n"."Content-length: " . strlen($this-> post_string) . "\r\nConnection: close\r\n\r\n".$this-> post_string;

//exit($out);

            fwrite($fp,$out);

while ($str = trim(fgets($fp, 4096)))

            {

$header .= $str;

            }

while (!feof($fp))

            {

$data.=fgets($fp, 4096);

            }

$this-> result=$data;

        }

else

        {

$context = array(

'http' => array(

'method' => 'POST',

'header' => 'Content-type: application/x-www-form-urlencoded\r\n' .                  

'Content-length:' . strlen($this-> post_string)+8,

'content' =>$this-> post_string)

            );

$stream_context = stream_context_create($context);

$data = file_get_contents($this->query_string(), false, $stream_context);

$this-> result=$data;

        }

    }

function get()

    {

if (extension_loaded('curl'))//已修正端口号问题

        {

$ch=curl_init();          

$url=$this->query_string();

            curl_setopt_array($ch, array(CURLOPT_URL=>$url,CURLOPT_RETURNTRANSFER=>1));

$this-> result=curl_exec($ch);

            curl_close($ch);

        }

else if(function_exists('fsockopen'))

        {

$parts = parse_url($this-> url);

$fp= fsockopen($parts['host'],isset($parts['port']) ? $parts['port'] : 80,$errno, $errstr,10);

if (!$fp) die("$errstr($errno)");

$url=$this->query_string(1);

$out = 'GET ' . $url . "\r\nConnection: Close\r\n\r\n";

            fwrite($fp, $out);

while ($str = trim(fgets($fp, 4096)))

            {

$header .= $str;

            }

while (!feof($fp))

            {

$data.=fgets($fp, 4096);

            }

$this-> result=$data;

        }

else

        {

$url=$this->query_string();       

$this-> result=file_get_contents($url);

        }

    }

function implode_with_key($assoc, $inglue = '=', $outglue = '&')

    {

$return = null;

foreach ($assoc as $tk => $tv) $return .= $outglue.$tk.$inglue.$tv;

return substr($return,1);

    }

function query_string($type=0)

    {

$parts = parse_url($this-> url);

$host_port=$parts['host'];

if($parts['port'])

        {

$host_port.=':'.$parts['port'];

        }

if (empty($parts['query']))

        {

$parts['query']=$this-> get_string;

        }

else

        {  

if(!empty($this-> get_string))

            {

$parts['query'].='&'.$this-> get_string;

            }

        }        

if($type)

        {

$url=$parts['path'].'?'.$parts['query']." HTTP/1.1\r\nHost: " . $host_port ;

        }

else

        {

$url=$parts['scheme'].'://'.$host_port.$parts['path'].'?'.$parts['query'];  

        }

//exit($url);

return $url;

    }

}

$ajax=new ajax();

源文档 <http://my.oschina.net/suconghou/blog/188006>

最新文章

  1. oracleDBA-D2
  2. Cocos2d-x 核心概念 - Node中的重要操作
  3. SQL语句的添加、删除、修改多种方法
  4. ARM-Linux S5PV210 UART驱动(2)---- 终端设备驱动
  5. redis的内部实现机制
  6. hibernate查询出的数据和数据库不一致
  7. 小白的Python之路 day4 装饰器前奏
  8. mybatis中 keyProperty=&quot;id&quot; 的作用
  9. 关于C#传给视图的字符串带有Html转义字符的处理
  10. JEECG 3.8宅男优化版本发布
  11. Dapper的应用
  12. Fiddler手机抓包软件简单使用--将h5效果显示在手机
  13. python六十二课——高阶函数之filter
  14. 微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常
  15. hadoopMR自定义输入类型
  16. Beta阶段——第2篇 Scrum 冲刺博客
  17. nodeJs 接收请求参数和发送请求参数
  18. 根据自定义区域裁剪ArcGIS切片地图服务
  19. 原创:微信小程序页面跳转展示缓冲提示
  20. 【EF】EntityFramework 更新数据库字段的三种方法

热门文章

  1. javascript私有属性失效及解决方案
  2. Linux 包管理基础:apt、yum、dnf 和 dpkg
  3. 第一章 Git 一览
  4. React库protypes属性
  5. [hdu3586]Information Disturbing树形dp+二分
  6. centos6.5安装sublime Text3破解版
  7. cordova之旅之初识
  8. Unite Europe案例项目《影子战术》层级优化经验分享
  9. 洛谷P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower
  10. cogs 1901. [国家集训队2011]数颜色