京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

php办理跨域题目的方法详解

2024-11-4 08:23| 发布者: db4d5a85| 查看: 78| 评论: 0

摘要: 跨域的严酷一点来说就是只要协议,域名,端口有任何一个的不同,就被当作是跨域。 比如,在实际项目中由于前后端分离当前端须要通过接口向后台发起哀求,此时就会出现跨域题目,那么,这类题目须要如何办理呢? 实在

跨域的严酷一点来说就是只要协议,域名,端口有任何一个的不同,就被当作是跨域。

比如,在实际项目中由于前后端分离当前端须要通过接口向后台发起哀求,此时就会出现跨域题目,那么,这类题目须要如何办理呢?

实在php办理跨域题目很简单,只需加上下面的代码就可以了:

[code]header("Access-Control-Allow-Origin:*"); [/code]

加上这行代码表示允许全部的域名访问,不过为了安全起见,在实际项目中往往会限定只允许固定的几个域名和方法发起的哀求。

1、允许单个域名访问

[code]header('Access-Control-Allow-Origin:http://www.startphp.cn'); header('Access-Control-Allow-Methods:POST'); //表示只允许POST哀求 header('Access-Control-Allow-Headers:x-requested-with, content-type'); //哀求头的限制 [/code]

2、不限制域名

[code]header('Access-Control-Allow-Origin:*'); header('Access-Control-Allow-Methods:POST');//表示只允许POST哀求 header('Access-Control-Allow-Headers:x-requested-with, content-type'); [/code]

3、允很多个域名访问

在实际项目中最好指定能跨域访问的域名,增加安全性。可以写在一个公共类里面,封装一个方法调用。

[code]// 设置能访问的域名 static public $originarr = [ 'https://test1.com', 'https://test2.com', ]; /** * 公共方法调用 */ static public function setheader() { // 获取当前跨域域名 $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : ''; if (in_array($origin, self::$originarr)) { // 允许 $originarr 数组内的 域名跨域访问 header('Access-Control-Allow-Origin:' . $origin); // 相应类型 header('Access-Control-Allow-Methods:POST,GET'); // 带 cookie 的跨域访问 header('Access-Control-Allow-Credentials: true'); // 相应头设置 header('Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token'); } }[/code]

在php上如何实现

[code]<?php // 制定允许其他域名访问 header("Access-Control-Allow-Origin:*"); // 相应类型 header('Access-Control-Allow-Methods:POST'); // 相应头设置 header('Access-Control-Allow-Headers:x-requested-with, content-type'); //$callback = isset($_REQUEST['callback']) ? trim($_REQUEST['callback']) : ''; //jsonp回调参数,必需 function getKey($key,$default=""){ return trim(isset($_REQUEST[$key])?$_REQUEST[$key]:$default); } $id = getKey("id"); $conn = mysqli_connect("localhost","root","","test") or die("毗连失败"); $conn->query("set names utf8"); $sql = "select * from data where ".$id." is not null"; $result = $conn->query($sql); $arr = []; while($row=$result->fetch_assoc()){ array_push($arr,json_encode($row)); } $json = json_encode($arr); //json 数据 print_r($json);[/code]

4 Nginx反向代理

使用nginx反向代理实现跨域,是最简单的跨域方式。只须要修改nginx的配置即可办理跨域题目,支持全部欣赏器,支持session,不须要修改任何代码,并且不会影响服务器性能。

实现思绪:通过nginx配置一个代理服务器(域名与domain1雷同,端口不同)做跳板机,反向代理访问domain2接口,并且可以顺便修改cookie中domain信息,方便当前域cookie写入,实现跨域登录。

修改配置文件nginx.conf,如下:

[code]// proxy服务器 server { listen 81; server_name www.domain1.com; location / { proxy_pass http://www.domain2.com:8080; #反向代理 proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名 index index.html index.htm; # 当用webpack-dev-server等中心件代理接口访问nignx时,此时无欣赏器到场,故没有同源限制,下面的跨域配置可不启用 add_header Access-Control-Allow-Origin http://www.domain1.com; #当前端只跨域不带cookie时,可为* add_header Access-Control-Allow-Credentials true; } } [/code]

配置修改好后,再重启nginx。

index.html文件访问代理服务器

[code]// index.html var xhr = new XMLHttpRequest(); // 前端开关:欣赏器是否读写cookie xhr.withCredentials = true; // 访问nginx中的代理服务器 xhr.open('get', 'http://www.domain1.com:81/?user=admin', true); xhr.send(); [/code]

server.js

[code]// server.js var http = require('http'); var server = http.createServer(); var qs = require('querystring'); server.on('request', function(req, res) { var params = qs.parse(req.url.substring(2)); // 向前台写cookie res.writeHead(200, { 'Set-Cookie': 'l=a123456;Path=/;Domain=www.domain2.com;HttpOnly' // HttpOnly:脚本无法读取 }); res.write(JSON.stringify(params)); res.end(); }); server.listen('8080'); console.log('Server is running at port 8080...');[/code]

以上就是php办理跨域题目的方法详解的详细内容,更多关于php办理跨域的资料请关注脚本之家别的相干文章!


来源:https://www.jb51.net/program/319486qbn.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-2 00:46 , Processed in 0.039710 second(s), 19 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部