<?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跨域问题的更多相关文章

  1. Laravel中的ajax跨域请求

    最近接触Laravel框架ajax跨域请求的过程中遇到一些问题,在这里做下总结. 一开始发起ajax请求一直报500错误,搜索相关资料后发现Laravel要允许跨域请求可以加入Cors中间件,代码如下 ...

  2. Ajax操作如何实现跨域请求 (JSONP和CORS实现Ajax跨域的原理)

    由于浏览器存在同源策略机制,同源策略阻止ajax (XMLHttpRequest) 从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 特别的:由于同源策略是浏览器的限制,所以请求的发送和响 ...

  3. Ajax跨域问题的两种解决方法

    浏览器不允许Ajax跨站请求,所以存在Ajax跨域问题,目前主要有两种办法解决. 1.在请求页面上使用Access-Control-Allow-Origin标头. 使用如下标头可以接受全部网站请求: ...

  4. 浅谈linux 下,利用Nginx服务器代理实现ajax跨域请求。

    ajax跨域请求对于前端开发者几乎在任何一个项目中都会用到,众所周知,跨域请求有三种方式: jsonp; XHR2 代理: jsonp: 这种应该是开发中是使用的最多的,最常见的跨域请求方法,其实aj ...

  5. 解决ajax跨域请求 (总结)

    ajax跨域请求,目前已用几种方法实现:   1)用原生js的xhr对象实现.                var url="http://freegeoip.net/json/" ...

  6. Ajax跨域访问wcf服务中所遇到的问题总结。

    工具说明:vs2012,sql server 2008R2 1.首先,通过vs2012建立一个wcf服务项目,建立好之后.再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务 ...

  7. JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  8. Ajax跨域:Jsonp原理解析

    推荐先看下这篇文章:JS跨域(ajax跨域.iframe跨域)解决方法及原理详解(jsonp) JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重 ...

  9. jquery ajax跨域调用

    客户端: //ajax跨域调用的方法 $.ajax({ url:dustUrl+"/screenshot/getDevices.do", type: "get" ...

  10. 浅析JSONP-解决Ajax跨域访问问题

    浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现 ...

随机推荐

  1. poj1065 Wooden Sticks[LIS or 贪心]

    地址戳这.N根木棍待处理,每根有个长x宽y,处理第一根花费1代价,之后当处理到的后一根比前一根长或者宽要大时都要重新花费1代价,否则不花费.求最小花费代价.多组数据,N<=5000 本来是奔着贪 ...

  2. Docker入门(七):部署app

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  3. python 带参数运行

    近段时间学考,又爱上了游戏.LOL  nba2k 使命召唤 哎! 因为使命召唤的原因  有时候会卡住  然后点关闭没用. 然后任务管理器打不开 所以我想写个杀掉这个程序的东西.  当然写一下是简单.但 ...

  4. 【opencv学习笔记三】opencv3.4.0数据类型解释

    opencv提供了多种基本数据类型,我们这里分析集中常见的类型.opencv的数据类型定义可以在D:\Program Files\opencv340\opencv\build\include\open ...

  5. Hive与表操作有关的语句

    Hive与表操作有关的语句 1.创建表的语句: Create [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COM ...

  6. Python学习——使用dict和set

    dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字 ...

  7. layer常用方法

    弹出层layer的使用 弹出层layer的使用 Intro layer是一款web弹层组件,致力于服务各个水平段的开发人员.layer官网:http://layer.layui.com/ layer侧 ...

  8. 交互原型设计软件axure rp学习之路(一)

    开始学习之前,请一定要明白:Axure是个极其极其极其简单的软件.因为你所做的就是拖部件,打字,拖部件,打字,最多加个对齐.如果你能把axure当作word或者ppt来用,那你就学会了axure. A ...

  9. 51nod 1086【背包·DP】

    思路: 如果体积乘以数量>=W,那么直接用完全背包模型.如果不到的话,用二进制优化就好了. 基础题,感觉这样写很优雅?回去睡觉. #include <bits/stdc++.h> u ...

  10. Unity 5.6中的混合光照(下)

    https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...