翼度科技»论坛 编程开发 PHP 查看内容

php解决跨域问题的方法详解

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
跨域的严格一点来说就是只要协议,域名,端口有任何一个的不同,就被当作是跨域。
比如,在实际项目中由于前后端分离当前端需要通过接口向后台发起请求,此时就会出现跨域问题,那么,这类问题需要如何解决呢?
其实php解决跨域问题很简单,只需加上下面的代码就可以了:
  1. header("Access-Control-Allow-Origin:*");
复制代码
加上这行代码表示允许所有的域名访问,不过为了安全起见,在实际项目中往往会限定只允许固定的几个域名和方法发起的请求。
1、允许单个域名访问
  1. header('Access-Control-Allow-Origin:http://www.startphp.cn');
  2. header('Access-Control-Allow-Methods:POST');    //表示只允许POST请求
  3. header('Access-Control-Allow-Headers:x-requested-with, content-type'); //请求头的限制
复制代码
2、不限制域名
  1. header('Access-Control-Allow-Origin:*');
  2. header('Access-Control-Allow-Methods:POST');//表示只允许POST请求
  3. header('Access-Control-Allow-Headers:x-requested-with, content-type');
复制代码
3、允许多个域名访问
在实际项目中最好指定能跨域访问的域名,增加安全性。可以写在一个公共类里面,封装一个方法调用。
  1. // 设置能访问的域名
  2. static public $originarr = [
  3.    'https://test1.com',
  4.    'https://test2.com',
  5. ];

  6. /**
  7. *  公共方法调用
  8. */
  9. static public function setheader()
  10. {
  11.    // 获取当前跨域域名
  12.    $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
  13.    if (in_array($origin, self::$originarr)) {
  14.       // 允许 $originarr 数组内的 域名跨域访问
  15.       header('Access-Control-Allow-Origin:' . $origin);
  16.       // 响应类型
  17.       header('Access-Control-Allow-Methods:POST,GET');
  18.       // 带 cookie 的跨域访问
  19.       header('Access-Control-Allow-Credentials: true');
  20.       // 响应头设置
  21.       header('Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token');
  22.    }
  23. }
复制代码
在php上如何实现
  1. <?php

  2. // 制定允许其他域名访问
  3. header("Access-Control-Allow-Origin:*");

  4. // 响应类型
  5. header('Access-Control-Allow-Methods:POST');

  6. // 响应头设置
  7. header('Access-Control-Allow-Headers:x-requested-with, content-type');

  8. //$callback = isset($_REQUEST['callback']) ? trim($_REQUEST['callback']) : ''; //jsonp回调参数,必需

  9. function getKey($key,$default=""){
  10.     return trim(isset($_REQUEST[$key])?$_REQUEST[$key]:$default);

  11. }

  12. $id = getKey("id");
  13. $conn = mysqli_connect("localhost","root","","test") or die("连接失败");
  14. $conn->query("set names utf8");
  15. $sql = "select * from data where ".$id." is not null";

  16. $result = $conn->query($sql);

  17. $arr = [];
  18. while($row=$result->fetch_assoc()){
  19.     array_push($arr,json_encode($row));

  20. }

  21. $json = json_encode($arr);  //json 数据
  22. print_r($json);
复制代码
4 Nginx反向代理
使用nginx反向代理实现跨域,是最简单的跨域方式。只需要修改nginx的配置即可解决跨域问题,支持所有浏览器,支持session,不需要修改任何代码,并且不会影响服务器性能。
实现思路:通过nginx配置一个代理服务器(域名与domain1相同,端口不同)做跳板机,反向代理访问domain2接口,并且可以顺便修改cookie中domain信息,方便当前域cookie写入,实现跨域登录。
修改配置文件nginx.conf,如下:
  1. // proxy服务器
  2. server {
  3.     listen       81;
  4.     server_name  www.domain1.com;
  5.     location / {
  6.         proxy_pass   http://www.domain2.com:8080;  #反向代理
  7.         proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名
  8.         index  index.html index.htm;

  9.         # 当用webpack-dev-server等中间件代理接口访问nignx时,此时无浏览器参与,故没有同源限制,下面的跨域配置可不启用
  10.         add_header Access-Control-Allow-Origin http://www.domain1.com;  #当前端只跨域不带cookie时,可为*
  11.         add_header Access-Control-Allow-Credentials true;
  12.     }
  13. }
复制代码
配置修改好后,再重启nginx。
index.html文件访问代理服务器
  1. // index.html
  2. var xhr = new XMLHttpRequest();
  3. // 前端开关:浏览器是否读写cookie
  4. xhr.withCredentials = true;
  5. // 访问nginx中的代理服务器
  6. xhr.open('get', 'http://www.domain1.com:81/?user=admin', true);
  7. xhr.send();
复制代码
server.js
  1. // server.js
  2. var http = require('http');
  3. var server = http.createServer();
  4. var qs = require('querystring');
  5. server.on('request', function(req, res) {
  6.     var params = qs.parse(req.url.substring(2));
  7.     // 向前台写cookie
  8.     res.writeHead(200, {
  9.         'Set-Cookie': 'l=a123456;Path=/;Domain=www.domain2.com;HttpOnly'   // HttpOnly:脚本无法读取
  10.     });
  11.     res.write(JSON.stringify(params));
  12.     res.end();
  13. });
  14. server.listen('8080');
  15. console.log('Server is running at port 8080...');
复制代码
以上就是php解决跨域问题的方法详解的详细内容,更多关于php解决跨域的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/program/319486qbn.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具