<?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);
?>
解决异步请求时跨域访问或同源策略的问题
最新推荐文章于 2023-04-21 17:50:46 发布