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>
Php—AJAX跨域问题的更多相关文章
- Laravel中的ajax跨域请求
最近接触Laravel框架ajax跨域请求的过程中遇到一些问题,在这里做下总结. 一开始发起ajax请求一直报500错误,搜索相关资料后发现Laravel要允许跨域请求可以加入Cors中间件,代码如下 ...
- Ajax操作如何实现跨域请求 (JSONP和CORS实现Ajax跨域的原理)
由于浏览器存在同源策略机制,同源策略阻止ajax (XMLHttpRequest) 从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 特别的:由于同源策略是浏览器的限制,所以请求的发送和响 ...
- Ajax跨域问题的两种解决方法
浏览器不允许Ajax跨站请求,所以存在Ajax跨域问题,目前主要有两种办法解决. 1.在请求页面上使用Access-Control-Allow-Origin标头. 使用如下标头可以接受全部网站请求: ...
- 浅谈linux 下,利用Nginx服务器代理实现ajax跨域请求。
ajax跨域请求对于前端开发者几乎在任何一个项目中都会用到,众所周知,跨域请求有三种方式: jsonp; XHR2 代理: jsonp: 这种应该是开发中是使用的最多的,最常见的跨域请求方法,其实aj ...
- 解决ajax跨域请求 (总结)
ajax跨域请求,目前已用几种方法实现: 1)用原生js的xhr对象实现. var url="http://freegeoip.net/json/" ...
- Ajax跨域访问wcf服务中所遇到的问题总结。
工具说明:vs2012,sql server 2008R2 1.首先,通过vs2012建立一个wcf服务项目,建立好之后.再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务 ...
- JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- Ajax跨域:Jsonp原理解析
推荐先看下这篇文章:JS跨域(ajax跨域.iframe跨域)解决方法及原理详解(jsonp) JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重 ...
- jquery ajax跨域调用
客户端: //ajax跨域调用的方法 $.ajax({ url:dustUrl+"/screenshot/getDevices.do", type: "get" ...
- 浅析JSONP-解决Ajax跨域访问问题
浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现 ...
随机推荐
- CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现
CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三:CR ...
- win10系统下安装64位Oracle11g+LSQL Developer
LSQL Developer作为强大的Oracle编辑工具,却只支持32bit,本文提供在安装用LSQL Developer打开64bitOracle的操作方法 工具/原料 oracle11g安装包 ...
- bzoj1055玩具取名——区间DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间DP,注意初始化!! 因为没记忆化,TLE了一晚上,区间DP尤其要注意不重复递归! ...
- poj2356Find a multiple——鸽巢定理运用
题目:http://poj.org/problem?id=2356 N个数,利用鸽巢定理可知应有N+1个前缀和(包括0),因此其%N的余数一定有重复: 同余的两个前缀和之差一定为N的倍数,据此得出答案 ...
- JQuery Mobile+cordova构建一个Android项目
1.安装Android开发环境 Android开发环境的安装,现在主要是由于不能访问谷歌站点,在windows下在host文件中添加一个对应的74.125.195.190 dl-ssl.goo ...
- WCF知识点(应用WCF支持原生Socket访问, 原始字节流传输)
最近在做区域医疗中PIX时, 需要让PIX Manager同时支持HL7的V2和V3版本.思路是利用WCF来同时支持V2版本的c/s架构式的消息协议和V3版本WebService的Soap协议. 实 ...
- Jasper:推送 API
ylbtech-Jasper:推送 API Control Center 还维护一个“推送 API”系统,一旦发生特定事件,就会向应用程序发送编程通知.例如,您可能选择在设备接近流量上限时收到通知.或 ...
- ubuntu 修改资源镜像
要修改的文件 /etc/apt/sources.list 原资源镜像文件 deb http://mirrors.aliyun.com/ubuntu/ yakkety main multiverse r ...
- why std::stack has separate top() and pop()
SGI explanation: http://www.sgi.com/tech/stl/stack.html One might wonder why pop() returns void, ins ...
- HTML页面弹出窗口调整代码总结
弹出跟你当前的窗口有没有菜单工具栏没有关系,你只要在页面中写一个脚本它就弹出了.比如<a href=# onclick="window.open('xxx.aspx','窗口名称',' ...