Php—AJAX跨域问题
<?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>
最新文章
- oracleDBA-D2
- Cocos2d-x 核心概念 - Node中的重要操作
- SQL语句的添加、删除、修改多种方法
- ARM-Linux S5PV210 UART驱动(2)---- 终端设备驱动
- redis的内部实现机制
- hibernate查询出的数据和数据库不一致
- 小白的Python之路 day4 装饰器前奏
- mybatis中 keyProperty=";id"; 的作用
- 关于C#传给视图的字符串带有Html转义字符的处理
- JEECG 3.8宅男优化版本发布
- Dapper的应用
- Fiddler手机抓包软件简单使用--将h5效果显示在手机
- python六十二课——高阶函数之filter
- 微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常
- hadoopMR自定义输入类型
- Beta阶段——第2篇 Scrum 冲刺博客
- nodeJs 接收请求参数和发送请求参数
- 根据自定义区域裁剪ArcGIS切片地图服务
- 原创:微信小程序页面跳转展示缓冲提示
- 【EF】EntityFramework 更新数据库字段的三种方法
热门文章
- javascript私有属性失效及解决方案
- Linux 包管理基础:apt、yum、dnf 和 dpkg
- 第一章 Git 一览
- React库protypes属性
- [hdu3586]Information Disturbing树形dp+二分
- centos6.5安装sublime Text3破解版
- cordova之旅之初识
- Unite Europe案例项目《影子战术》层级优化经验分享
- 洛谷P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower
- cogs 1901. [国家集训队2011]数颜色