解决异步请求时跨域访问或同源策略的问题

<?php
/**
 * 异步访问的同源策略
 * :异步请求禁止跨域访问,也就是http://sina.com不会让http://localhost去异步调用请求。
 * :解决这个问题可以使用iframe模拟异步请求,或者使用getJSON之类的函数。比较明智的方法还
 * :有使用一个服务器代理。
 * version : 01
 */
	$allowed_hosts=array(
		'mysite'=>array(
			'protocal'=>'http',
			'mimetype'=>'application/json',
			'args'=>array(
				'login'=>'user',
				'apikey'=>'secret'
			)
	));
	//返回请求的主机名
	$request_host=parse_url('http:/'.$_SERVER['PATH_INFO'],PHP_URL_HOST);
	if(!isset($allowed_hosts[$request_host])){
		header("Status: 430 Forbidden");
		exit;
	}
	//创建正确的url请求
	$url=$allowed_hosts[$request_host]['protocal'].':/'.$_SERVER['PATH_INFO'];
	if(!empty($_SERVER['QUERY_STRING'])){
		$url.='?'.http_build_query($_GET + isset($allowed_hosts[$request_host]['args'])? $allowed_hosts[$request_host]['args'] : array());
	}
	//cul请求处理
	$curl=curl_init($url);
	if($_SERVER['REQUEST_METHOD']=='POST'){
		$data=http_build_query($_POST);
		curl_setopt($curl,CURLOPT_POST,true);
		curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
	}
	curl_setopt($curl,CURLOPT_HEADER,false);
	curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
	$response=curl_exec($curl);
	//处理请求返回数据
	$status=curl_getinfo($curl,CURLINFO_HTTP_CODE);
	if($status>='400'){
		header('Status:500 Internal Server Error');
	}
	header('Content-Type:'.$allowed_hosts[$request_host]['mimetype']);
	echo $response;
	curl_close($curl);
?>

你可能感兴趣的:(异步,跨域访问,同源策略)