PHP接口跨域header头以及Session跨域方法

跨域问题一直都很纠结的,最近做项目是真正遇到了。现代浏览器针对不同域名之间的ajax请求,一般情况下会阻止你获取到ajax返回内容(即使是1.a.com和2.a.com也算跨域),但是请求是真实发生的。下面来讲一下,怎么在PHP后端让浏览器支持跨域请求。

// 允许所有跨域请求
header('Access-Control-Allow-Origin: *');
// 只允许http://www.baidu.com下发来的跨域请求
header('Access-Control-Allow-Origin: http://www.baidu.com');

但是我们在开发接口时,可能会提供给很多个客户网站使用。如果单纯使用*或者具体域名就不太科学了,这时候我们需要进行动态的判断处理。

// 定义一个允许跨域请求接口的域名列表,这里你可以用配置也可以用其它形式,我这里只是用$GLOBALS简单演示一下
$GLOBALS['API_ALLOW_ORIGINS'] = array(
	'baidu.com',
	'yurunsoft.com'
);
// 判断是否有origin请求头
if(isset($_SERVER['HTTP_ORIGIN']))
{
	// 遍历域名列表判断
	foreach($GLOBALS['API_ALLOW_ORIGINS'] as $domain)
	{
		if($_SERVER['HTTP_ORIGIN'] === $domain || substr($_SERVER['HTTP_ORIGIN'], -strlen($domain) - 1) === '.' . $domain)
		{
			header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
			break;
		}
	}
}

接下来要解决Session跨域问题,如何让1.a.com和2.a.com的session互通呢?

ini_set('session.cookie_domain', '.a.com');

然后在header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);下面加上

header('Access-Control-Allow-Credentials: true');
  • 发表评论
当前用户:
  • 评论列表
  • memory 2018-02-11 16:31:24

    session跨域中,如果是完全不同的域名 a.com,b.com咧