php跨域问题记录

PHP开发中的跨域问题及解决方案 跨域问题源于浏览器的同源策略(Same-Origin Policy)。同源策略是浏览器的一种安全机制,它限制了从一个源加载的文档或脚本如何与另一个源的资源进行交互。所谓“同源”,指的是协议、域名和端口号都相同。如果其中任何一个不同,就属于跨域请求。和是不同源(协议不同)。和是不同源(域名不同)。和是不同源(端口不同)。跨域问题是Web开发中不可避免的挑战,但通过CORS、JSONP、代理服务器和WebSocket等技术,我们可以有效地解决这一问题。在实际开发中,应根据具体需求选择合适的解决方案。 阅读详情

记录跨域问题

一、问题

在控制层加了如下代码:

header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN'] );
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: X-Requested-With,Content-Type,Accept');

打开chrome的network里的response,没有这几个值~

但是同样的代码我在本地另一个项目里是OK的,项目环境是Nginx做了层代理,实际用的是PHP当Apache模块的方式,就开始怀疑:

  • 输出时框架限制了
  • Nginx/Apache限制了header(ps:我们项目是用Nginx当了反向代理,PHP当Apache模块)
  • 灵魂拷问:PHP输出时这些header是怎么返回的?

二、解决

1.框架

用xdebug跟了下,没看到框架里有任何限制不能更改header

2.web服务器

看到response每次返回的都一样,以为是运维控制了返回的选项,不能随意添加,和运维同事沟通了下,发现确实是不能随意添加header头,窃喜以为找到了原因。然而另一个同事说加的跨域允许是OK的;Nginx的conf里加的proxy 也是把Apache返回的header都返回了,排除

3.文件问题

重新思考,跨域问题是浏览器控制的,只要HTTP协议里返回的access允许就可以了。

使用header_list()方法打印了下发送的header列表,发现自己写的那几个没返回。

换种思路,把这几行加到其他文件,发现可以,然后对比俩文件有啥区别,最后最后的原因是<?php这个标识是从第2行开始写的,即在header方法之前有了输出。

三、补充

1.同源策略

参考:

浏览器同源政策及其规避方法

跨域资源共享CORS详解

浏览器安全的基石是"同源政策",如果非同源,共有3种行为受到限制

  • cookie、LocalStorage和IndexDB(浏览器提供的本地数据库)无法读取
  • dom无法获得(如iframe和window.open如果不同源,就无法通信)
  • ajax请求不能发送

这里主要讨论下ajax的跨域解决方法,

2.跨域解决方式:

  • jsonp
  • cors
  • 反向代理
2.1 jsonp

全称:json for padding 本质是用<script>标签可以跨域访问的性质,动态创建一个script,然后回调js数据脚本,请求类型是js而非xhr.普通接口返回的是数据对象,而jsonp是js数据脚本

2.2 CORS

CORS是一个W3c标准,全称是“跨域资源共享”(cross-origin resource sharing),允许浏览器向跨源服务器,发出XMLHttpRequest请求。

需要浏览器和服务器同时支持。目前所有浏览器都支持该功能,整个cors通信过程不需要用户参与。

浏览器将cors请求分为两种:简单请求和非简单请求

只要同时满足以下两个条件,就属于简单请求:

(1) 请求方法是以下三种方法之一:

    HEAD
    GET
    POST

(2)HTTP的头信息不超出以下几种字段:

    Accept
    Accept-Language
    Content-Language
    Last-Event-ID
    Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

否则属于非简单请求。

2.2.1 简单请求

浏览器在头信息中增加一个origin字段,用来说明本次请求来自哪个源(协议+域名+端口)。服务器根据这个值决定是否同意这次请求。

如果服务器没有返回access这样的头部信息,即服务器没支持的话,前端的console里会显示access to xmlHttpRequest ...has been blocked by CORS policy...

如果origin指定的域名在许可范围内,服务器返回的响应会多出几个头信息字段:

Access-Control-Allow-Origin: xxxx
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: xxx

Access-Control-Allow-Origin:

是必须的,值要么是请求时origin字段的值,要么是*表示接受任意域名的请求。

Access-Control-Allow-Credentials

可选,布尔值,表示是否允许发送cookie,不同源时请求中不会带cookie,设为true表示服务器许可cookie可以包含在请求中,
XMLHttpRequest.withCredentials属性是一个boolean类型,表示是否该使用cookie,authorization header(头部授权)或者TLS客户端证书这一类资格证书来创建一个跨站点访问控制请求。

参考:
xmlHttpRequest.withCredentials

Access-Control-Expose-Headers

可选,cors请求时,xmlHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。

如果要带上cookie,后台的origin就不能设为*,且需要前端设置如下:

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
2.2.2 非简单请求

是对服务器有特殊请求的:如请求方法是put或delete,或者content-type字段的类型是application/json.

非简单请求会在正式通信之前,增加HTTP查询请求,称为预检请求。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单中,以及可以使用那些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

预检请求

1)请求:

预检请求用的方法是option,表示这个请求时用来询问的。头信息里关键字段是origin表示请求来自哪个源。

2)回应:

服务器收到预检请求后,检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。

服务器返回的Access-Control-Max-Age
该字段可选,用来指定本次预检请求的有效期,单位为秒。上面结果中,有效期是20天(1728000秒),即允许缓存该条回应1728000秒(即20天),在此期间,不用发出另一条预检请求

一旦服务器通过了预检请求,以后每次浏览器正常的cors请求都和简单请求一样。

posted on 2019-02-18 18:31 芽小凡 阅读( ...) 评论( ...) 编辑 收藏
vue入门:用axios跨域连接PHP+MySQL后台 毕业论文是要PHP写后台做一个租车网站,略懂vue,无奈使用vue+axios+PHP搭配写后台,小白入门一步一个坑,哭唧唧 阅读详情

相关推荐

TP5解决CORS跨域问题 --- 20/04/23

萌新小白的记录贴。 1.application目录下api接口目录新建behavior模块,模块下创建CORS控制器 <?php namespace app\api\behavior; class CORS { public function appInit(&$params) { header('Access-Control-Allow-Or...

HimeYui的博客 2217

php header解决跨域问题

header(‘Access-Control-Allow-Credentials:true’); header(‘Access-Control-Allow-Origin:http://baidu.com’); 这样http://baidu.com可以访问你的网站获取到数据了

weixin_39010985的博客 1629

VCSA 6.7证书过期别慌!手把手教你通过SSH修改系统时间恢复登录(附STS证书修复脚本)

本文详细介绍了VCSA 6.7证书过期的应急处理方案,包括通过SSH修改系统时间临时恢复登录、全面更新证书体系以及专项修复STS证书的实战步骤。文章还提供了后期验证和系统加固的建议,帮助运维人员有效应对证书过期问题,确保虚拟化平台的稳定运行。

weixin_31292729的博客 415

在Nginx的nginx.conf 配置访问PHP&遇到的问题+解决

首先你需要先安装Nginx和PHP,如果你不会安装Nginx和PHP可以在网上找,或者在我的文章里面找。安装完成之后,开启Nginx的端口号,还必须验证是否成功,如果成功之后,你就可以继续后面的步骤,在Nginx中配置PHP。

m0_52985087的博客 5477

DAGGER vs 传统模仿学习:为什么数据聚合能提升模型性能?

本文深入对比了DAGGER与传统模仿学习,揭示了传统方法因“分布不匹配”导致性能下降的根源。DAGGER通过动态的**数据聚合**机制,在智能体自身策略产生的状态分布上收集专家数据,从根本上解决了误差累积问题,从而显著提升了模型在实际部署中的鲁棒性和性能。

weixin_29170327的博客 234

Unreal 5 MetaHuman插件全流程:从安装到角色动画生成

本文详细介绍了Unreal 5中MetaHuman插件的全流程使用指南,从安装配置到角色动画生成。通过Quixel Bridge下载预设角色,利用面部捕捉技术赋予数字人模型生命力,并提供材质编辑、性能优化等进阶技巧,帮助用户快速创建照片级真实的虚拟角色。

weixin_29009081的博客 829

跨域请求携带cookie需配置Access-Control-Allow-Credentials为true

当跨域请求需要携带cookie是,请求头中需要设置Access-Control-Allow-Credentials:true。 Access-Control-Allow-Credentials值为true时,Access-Control-Allow-Origin必须有明确的值,不能是通配符(*) ...

yihanzhi的博客 1万+

Electron vue3 - 使用SerialPort与串口交互教程,计算机串行端口(COM口、USB转串口等)进行通信连接读取或写入Arduino、单片机、PLC、扫码枪、打印机、老式调制解调器!

实战Electron使用SerialPort与串口交互详细全过程,Electron-vue3与串口交互示例,Electron vue使用serialport实现串口交互通讯,Electron-vue使用serialport连接本地串口,electron-vue 台称串口对接 SerialPort,electron串口调试工具,electron+vue+serialport实现串口通信,串口通信serialport使用和调试,electron-vue使用serialport串口通信及踩过的坑(已解决!)ele

🏆 前端领域优质创作者 4641

nginx 代理 解决 vue 跨域

前段时间做项目遇到了前后端分离跨域问题,用后端PHP设置跨域没有解决,前端vue设置也没有解决,最后用了nginx代理解决了 server { listen 8090; server_name xxx.aaa.com;//访问域名 root /data/xxx/xxx/xxx/web/register/dist;//vue项目访问路...

BlueSky 407

【2025年华为秋招(AI)-11月19日-第二题(200分)- 终端款型聚类识别】(题目+思路+Java&C++&Python解析+在线测试)

该摘要总结了题目要求、输入输出格式、KMeans算法的实现步骤以及关键点。以下是150字内的摘要: 本文提出基于KMeans算法对终端型号进行聚类的方法。通过包间隔时长、连接持续时长、漫游前后信号强度4个特征,使用欧氏距离度量相似度。算法采用固定初始化策略(前k个样本作为初始质心),经过分配-更新迭代,直至质心移动小于1e-8或达到最大迭代次数。最终输出各簇样本数并按升序排列,解决了终端型号自动分类问题。示例显示该方法能有效识别3-4类终端,并准确统计每类数量。

m0_73659489的博客 141

面向RKNN平台的YOLOv11 Pose部署实战:模型转换、优化与端侧姿态估计推理

本文研究了YOLOv11 Pose模型在Rockchip RKNN平台上的部署方案。通过分析模型架构和关键技术,提出完整的转换流程,包括ONNX格式转换、检测头优化和量化配置。在RK3588硬件平台上实现了100 FPS的实时姿态检测,验证了该方案的可行性。研究主要贡献包括:1)提出YOLOv11 Pose到RKNN平台的完整转换方案;2)优化后处理算法;3)实现高效的边缘计算部署。实验结果表明,该方案能有效解决边缘设备计算资源受限的问题,为人机交互等应用场景提供了实用的技术方案。

m0_71589036的博客 613

laravel预请求跨域的问题

在public添加 我这里是允许所有请求,参数大家自己设置 // 跨域 if(isset($_SERVER['HTTP_ORIGIN'])){ header("access-control-allow-origin: *"); header("access-control-allow-headers:*"); header("access-control-expose-...

大海技术博客 482

Matlab:Matlab 软件学习之Matlab内置的各种系统的简介、案例应用(基于Simulink模糊控制仿真/二阶瞬态震荡电路案例)之详细攻略

选择左上角要编辑变量的图标,给定当前变量的论域Range,设置隶属函数类型type(八种隶属函数类型以供选择),最后选中某个隶属度函数(选中为红色),移动绘图区的每个隶属度函数的三个端点(竖向为权重)。(1)、首先在模糊规则编辑器左边选择一个输入变量,并选中它的一个语言值(隶属函数),然后编辑器右边选择一个输出变量,并选中它的一个语言值(隶属函数),然后将这种关系添加到模糊规则中。制定完成后,会形成模糊规则矩阵,系统会根据模糊输入量(如r1、r2),经过模糊规则(如45条),进而确定输出量(Y1、Y2)。

走向CTO之路 1122

【备份】php项目处理跨域请求踩坑

确定用了几种方式,以上代码改来改去,翻来覆去测,还是不行,最后带着实在不相信是框架代码的问题去复制了“跨域检测无效”,去代码里面搜索了一番,结果!,竟然在代码里面做了跨域处理,只是这跨域处理不对,导致我在入口怎么改都没用!但是现在浏览器跨域访问我的接口,依然报跨域错误,问了各大AI,也做了多重尝试,结果还是不行。竟然是很久以前埋下的坑,我就说我不会犯这种错误,这下打脸了!浏览器请求的api接口返回:跨域检测无效(我的代码没有输出这行代码)这都是老生常谈的东西了。// 处理预检请求 (OPTIONS)

qq_15941409的博客 621

一句话看懂 vibing-steampunk

摘要: vibing-steampunk(vsp)是一个连接SAP ABAP开发工具(ADT)与AI编码代理(如Claude、GitHub Copilot)的桥梁,通过MCP协议实现自动化代码读写、调试和部署。它利用ADT API直接访问SAP系统,绕过传统GUI操作,支持ECC和S/4HANA等环境。工具提供包分析、依赖检查、LUW行为识别等功能,显著提升ABAP项目维护效率。其创新Hyperfocused模式和方法级编辑大幅降低token消耗,而上下文压缩技术则优化了AI对ABAP代码的理解能力,特别适

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 114

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

关于thinkphp跨域的坑及解决方法

关于thinkphp跨域 我使用的是thinkphp5.1版本,版本自带跨域解决方案,但好像不起作用。 我是用以下方法解决: class Common extends Controller { // 控制器初始化 protected function initialize() { parent::initialize(); // 允许的源域名 header('Access-Control-Allow-Origin:*'); //

kaiup的博客 1952

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jquery同域与跨域笔记

php 输出 table <body> <?php sleep(3);//执行到这里的时候等待3秒 /*这里的数据是假数据,真正的场景中数据基本上都是来自数据库。*/ $arr = array(); $arr[0] = array('name'=>'三国演义','auhor'=>'罗贯中','category'=>'古典文学','desc'=>'一个群雄争霸的年代'); $arr[1] = array('name'=>'水浒传','auh

qq_64353584的博客 541

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

php SESSION跨域问题

这段时间随着项目功能的扩展,慢慢接触到了跨域方面的知识,遇到的更多的问题也是前端与后端交互的时候跨域问题。关于js跨域的问题我会在其他分类里面写。这里记录我今天遇到的php session跨域问题 当我们使用php绘制图形验证码的时候,在进行验证输入是否正确的时候,如果是跨域请求$_SESSION则会出现请求失败的情况,主要还是SESSION_ID传递问题,服务端判断的结果为当前SES...

weixin_30252709的博客 194

【转】php通过curl跨域向asp.net服务器上传文件及参数

转:http://blog.sina.com.cn/s/blog_13331dce50102vq32.html 这是一个由php通过调用asp.net接口向asp.net服务器post上传文件及参数并根据返回值判断上传结果的问题开始的,当第一次接到这个问题时很快的想到了解决办法: 1. 先通过html页面的form表单将图片及参数上传到php...

weixin_34114823的博客 151

【转】$.getJSON与PHP跨域请求问题解决

tJSON获取数据处理。     错误如下:         在火狐浏览器中:SyntaxError: missing ; before statement       经搜索解决方案得到如下信息: $b = json_encode($data); header("Access-Control-Allow-Origin:http:xxx.cn");//(1) echo "{$_GET['jsoncallback']}({$b})";//(2) exit

架构精进之路 322

Ajax跨域的问题

在学习ajax的过程中,我为了测试从前端页面中获取本地服务器中php文件的信息,使用Wampserver,端口为80。 在本地打开.html文件后进行查询操作 结果出现了跨域问题。 因此在chrome浏览器设置中添加命令” --allow-file-access-from-files“ 然而结果并没有改变,依然是这条报错信息。 最后从浏览器通过localhost进入.html文件。 成...

altechistBlog 158

uni-app部署h5到php,Thinkphp5.1允许uni-app的H5跨域请求接口解决方法

情景:uni-app使用vue框架开发夹杂APP,虽然APP或者小程序没有跨域,但希望就是写完这个既有H5,又有APP,小程序等,所以能通过后端解决跨域最好。然则不知道是vue的缘故原由照样什么,在PHP接口基类中添加了header头完全不起作用。官方给出的方式也有,详细可以看https://uniapp.dcloud.io/api/request/request。剖析:1. 以前的做法是在接口添...

weixin_36255517的博客 1119

vue php axios 跨域,VUE axios发送跨域请求需要注意的问题

在实际项目中前端使用到vue,后端使用php进行开发。前端使用axios请求请求关于跨域跨域的概念这些就不说了,百度一大堆相关的资料信息。我就只在这里记录下我在使用当中遇到的问题,以纪念在逝去的几个小时中资料查找的艰辛。不多说,直接上代码~~~~同理,跨域的解决方案为cros。服务器 PHP端代码如下(laravel 中间件进行处理):public function handle($request...

weixin_39645019的博客 158

Think PHP8操作MySQL的接口开发安装流程+防跨域报错处理

三、设置完毕后,就可以在 /app/controller 开发数据库的控制器,然后对数据库操作,并返回内容。1.在/app/middleware/CorsMiddleware.php 中设置以下代码。2./config/router.php 强制使用路由改为true。1./config/app.php 是否启用路由改为true。四、开发完控制器记得设置路由在 /router/app.php。2.将/app/middleware.php 中设置成以下代码。二、本地部署成功之后,进行以下流程用于正常开发。

s337315424的博客 423
上一篇: git查日志命令
下一篇: session临时文件存储路径
github_37030657
博客等级 码龄10年 4粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值