实现跨域请求一般可以使用以下三种方法:
- 修改目标服务器响应头信息
- 使用代理服务器转发请求
- JSONP跨域请求
下面我会详细讲解每种方法的实现以及示例说明。
方法一:修改目标服务器响应头信息
当浏览器端发起获取其他域下的数据时,浏览器会限制跨域请求,此时可以通过修改目标服务器响应头信息来实现跨域。
通常使用Access-Control-Allow-Origin
来允许指定域名的跨域请求。
具体步骤:
- 在目标服务器的响应头中添加“Access-Control-Allow-Origin”字段,允许指定的域名访问该服务器资源
- 返回结果时需要如下设置:
header("Access-Control-Allow-Origin:*")
或者指定的域名
示例代码(返回json数据):
<?php
header('Access-Control-Allow-Origin:*'); //允许所有域名跨域访问
header('Content-Type:application/json;charset=utf-8');
echo json_encode(['code'=>0, 'msg'=>'success', 'data'=>['name'=>'Tom', 'age'=>18]]);
?>
方法二:使用代理服务器转发请求
如果目标服务器响应头信息不能被修改,则需要使用代理服务器进行转发请求。
步骤:
- 在本地启动一个web服务器
- 通过Localhost请求web服务器,web服务器将请求重定向到目标服务器
- 当响应返回web服务器时,将响应返回到客户端
示例代码:
index.html
<!DOCTYPE html>
<html>
<head>
<title>跨域请求演示</title>
<meta charset="utf-8">
</head>
<body>
<h1>使用代理服务器进行跨域请求</h1>
<button onclick="getRemoteData()">获取远程数据</button>
<script>
function getRemoteData() {
fetch('http://localhost/proxy.php?url=http://remote-server.com/data.php')
.then(response => response.json())
.then(data => console.log(data))
.catch(err => console.error(err));
}
</script>
</body>
</html>
proxy.php
<?php
$url = $_GET['url'];
$html = file_get_contents($url);
header("Content-Type: application/json");
echo $html;
?>
方法三:JSONP跨域请求
JSONP(JSON with Padding)实际上是一种借助<script>
标签进行跨域访问的技术。
- 在客户端定义一个回调函数
- 在请求URL中添加一个参数callback
- 服务端返回调用客户端定义的回调函数
示例代码:
index.html
<!DOCTYPE html>
<html>
<head>
<title>跨域请求演示</title>
<meta charset="utf-8">
</head>
<body>
<h1>使用JSONP进行跨域请求</h1>
<button onclick="getData()">获取远程数据</button>
<script>
function getData() {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', 'http://remote-server.com/data.php?callback=showData');
document.head.appendChild(script);
}
function showData(data) {
console.log(data);
}
</script>
</body>
</html>
data.php
<?php
$data = ['name'=>'Tom', 'age'=>18];
$callback = $_GET['callback'];
echo $callback . '(' . json_encode($data) . ')';
?>
以上是实现PHP跨域请求的三种方法,不同的方法适用于不同的场景,开发者可以根据自己的需求选择最合适的方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP如何实现跨域 - Python技术站