PHP跨域问题

作者: 封不然 | 来源:发表于2018-08-13 23:01 被阅读18次

开头不多说,先上代码示例,想了解下的,可以接着往后看,注意以下两个是有差别的。

// 允许任意的origin以任意的请求方式获取资源
header('Access-Control-Allow-Origin:  *');
header('Access-Control-Allow-Headers: content-type');
header('Access-Control-Allow-Methods: *');

// 允许指定的$origin,以下面三种方式获取资源(可附带身份凭证的请求)
header("Access-Control-Allow-Origin:  $origin");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: content-type');
header('Access-Control-Allow-Methods: GET,POST,OPTIONS');

使用以上两种方式基本可以解决大家所遇到的跨域问题,那么可能会有人有疑问了,在header中的这些分别代表什么意思呢?他们分别都起到什么作用?还有就是“可附带身份凭证”的做什么用呢?

  • 1.为什么以及什么时候会产生跨域问题

当一个请求与所要请求的资源所在的服务器不在同一个域,或者不在同一个端口的时候,资源会产生一个跨域的Http请求

为什么会有跨域呢?实际上简单的说就是一切为了安全,例如XMLHttpRequest 和 Fetch API 遵循同源策略。如果不遵循此策略的存在的话,最容易产生的便是CSRF攻击(跨站请求伪造),攻击者盗用了你的身份,以你的名义发送恶意请求。

  • 2.上述使用到的头的含义以及作用
Origin  指示了请求来自于哪个站点(仅指示服务器名称,并不包含任何路径信息)

Access-Control-Allow-Origin 响应头指定了该响应的资源是否被允许与给定的origin共享。

Access-Control-Allow-Headers 用于预检请求中,列出了将会在正式请求的 Access-Control-Expose-Headers 字段中出现的首部信息。简单首部,如Accept、Content-Language、Content-Type等

Access-Control-Allow-Methods 响应标头指定响应访问所述资源到时允许的一种或多种方法预检请求

Access-Control-Allow-Credentials响应报头指示的请求的响应是否可以暴露于该页面。当true值返回时它可以被暴露。(凭证是 Cookie ,授权标头或 TLS 客户端证书。)

特别说明一下,我们尤其需要注意的是 Access-Control-Allow-Credentials,如果不为true的时候,请求是无法携带cookie等身份凭证信息的!并且当其为true的时候,Access-Control-Allow-Origin是必须要指定的。

    1. HTTP访问控制(CORS)

跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST请求),浏览器必须首先使用 OPTIONS方法发起一个预检请求,从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据),如下图。(实际场景举例:当前较为流行的vue等,前端框架,在请求的时候会预先发出个options请求,再发送实际请求,就是来源于此,有兴趣的同学可以去了解下)

图一
  • 4.跨域附带身份凭证的请求

CORS 的一个有趣的特性是,可以基于 HTTP cookies 和 HTTP 认证信息发送身份凭证。一般而言,对于跨域的AJAX请求,浏览器不会发送身份凭证信息。如果要发送凭证信息,需要设置的话,就需要如上文所述将 Access-Control-Allow-Credentials 设置为true,并指定对应Origin。

另外对于响应而言,响应首部中也携带了 Set-Cookie 字段,尝试对 Cookie 进行修改也需要如此。如果操作失败,将会抛出异常

推荐参考文章,希望你能有所收获:
https://cloud.tencent.com/developer/section/1189894
https://developer.mozilla.org/zh-CN/docs/Web/HTTP

相关文章

  • php解决跨域访问

    php跨域问题解决判断 参考文章:php跨域:https://blog.csdn.net/ouxiaoxian/a...

  • AnugularJS 的跨域

    通过 php 桥接跨域 实际上并非跨域,用 Php 文件引入进来,同源下执行 Php 文件,所以并非跨域 $htt...

  • 开发中的一些小事

    跨域 问题描述:php程序部署到nginx服务器,前端调用API报出跨域问题(200时没问题,422时出现此问题)...

  • PHP跨域问题

    开头不多说,先上代码示例,想了解下的,可以接着往后看,注意以下两个是有差别的。 使用以上两种方式基本可以解决大家所...

  • PHP跨域问题

    使用iframe方式实现局部刷新,但是iframe不支持跨域 通过script方式,src属性可以实现跨域,但只能...

  • php 跨域问题

    php 跨域设置 最近在做一个关于 ionic 的练习项目, 自己搭建后台 服务, 后来发现一直报错 500 显示...

  • 前后端完全开发问题

    php 解决跨域问题 header('Access-Control-Allow-Origin:http://www...

  • PHP后台代码解决跨域问题

    PHP后台代码解决跨域问题 在前端里面,解决跨域的时候总显得那么的恶心,什么jsonp啊,ajax啊,CORS啊什...

  • 深入跨域问题(3) - 利用 JSONP 解决跨域

    深入跨域问题(1) - 初识 CORS 跨域资源共享;深入跨域问题(2) - 利用 CORS 解决跨域深入跨域问题...

  • PHP Ajax 跨域问题最佳解决方案

    PHP Ajax 跨域问题最佳解决方案 本文通过设置Access-Control-Allow-Origin来实现跨...

网友评论

    本文标题:PHP跨域问题

    本文链接:https://www.haomeiwen.com/subject/xqepbftx.html