
本文深入探讨了PHP与J*aScript进行跨域资源共享(CORS)时遇到的常见问题,特别是“Cross-Origin Request Blocked”错误。教程详细解释了CORS机制,包括预检请求(OPTIONS)的处理,并提供了在PHP后端正确配置`Access-Control`系列HTTP响应头的实用代码示例和最佳实践,旨在帮助开发者有效解决跨域通信障碍。
在现代Web开发中,前端(如使用J*aScript)与后端(如使用PHP)进行数据交互是常态。然而,由于浏览器的“同源策略”(Same-Origin Policy)安全限制,当一个网页尝试请求不同源(协议、域名或端口任一不同)的资源时,浏览器会阻止该请求,并抛出“Cross-Origin Request Blocked”错误。这就是跨域问题。
为了解决这一问题,W3C推出了跨域资源共享(CORS)标准。CORS允许服务器在响应头中声明哪些源可以访问其资源,从而放宽同源策略的限制。
CORS请求分为“简单请求”和“非简单请求”。
简单请求:满足以下所有条件的请求:
非简单请求:不满足简单请求条件的任何请求,例如:
对于非简单请求,浏览器在发送实际请求之前,会先发送一个OPTIONS类型的“预检请求”(Preflight Request)到目标服务器。这个预检请求的目的是询问服务器,是否允许当前源发送实际请求,以及允许使用哪些HTTP方法和请求头。服务器必须对这个预检请求做出正确的响应,包含一系列Access-Control头部,浏览器才会继续发送实际请求。如果预检请求失败(例如,服务器没有正确响应CORS头),浏览器将直接阻止后续的实际请求。
解决跨域问题的关键在于服务器端(PHP)正确设置CORS相关的HTTP响应头。以下是几个最重要的头及其作用:
Access-Control-Allow-Origin:
Access-Control-Allow-Methods:
Access-Control-Allow-Headers:
AI at Meta
Facebook 旗下的AI研究平台
72
查看详情
Access-Control-Allow-Credentials:
Access-Control-Max-Age:
以下是一个健壮的PHP代码示例,用于处理CORS请求,特别是预检请求:
<?php
class ControllerCustomapiTest extends Controller {
public function index() {
// 1. 获取请求的源 (Origin),用于动态设置 Access-Control-Allow-Origin
// 通常从 HTTP_ORIGIN 头获取,如果不存在,某些旧浏览器可能使用 HTTP_REFERER
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
// 允许的源列表
$allowedOrigins = [
'http://localhost:4200', // 示例:您的前端开发环境
'https://your-production-frontend.com' // 示例:您的生产环境
];
// 检查请求源是否在允许列表中
if (in_array($origin, $allowedOrigins)) {
header("Access-Control-Allow-Origin: " . $origin);
} else {
// 如果不在允许列表中,可以拒绝访问或设置一个默认值(不推荐*)
// 或者直接不设置 Access-Control-Allow-Origin,浏览器会阻止请求
// header("Access-Control-Allow-Origin: https://your-default-frontend.com"); // 示例
}
// 允许携带认证信息(如Cookie)
header('Access-Control-Allow-Credentials: true');
// 预检请求结果缓存时间,单位秒 (例如:一天)
header('Access-Control-Max-Age: 86400');
// 2. 处理 OPTIONS 预检请求
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
// 允许的HTTP方法
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) {
header("Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS");
}
// 允许的请求头
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) {
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
}
// 预检请求处理完毕,终止脚本执行
die('OK');
}
// 3. 处理实际请求 (GET, POST, etc.)
// 设置响应内容类型为JSON
header('Content-Type: application/json');
// 示例:实际业务逻辑响应
$response = array(
'success' => true,
'message' => 'Data received successfully!',
'data' => $_POST // 假设是POST请求,这里可以处理请求体
);
echo json_encode($response);
}
}
?>代码解析:
动态设置 Access-Control-Allow-Origin:
设置 Access-Control-Allow-Credentials 和 Access-Control-Max-Age:
处理 OPTIONS 预检请求:
处理实际请求:
前端J*aScript代码通常不需要为CORS做特殊处理,只需按照正常的fetch或XMLHttpRequest方式发送请求即可。如果后端设置了Access-Control-Allow-Credentials: true,前端也需要相应地设置:
const url = 'https://opecart9349.000webhostapp.com/unzipper/opencart/index.php?route=customapi/test';
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
// 如果后端允许,可以添加自定义头,例如 'Authorization': 'Bearer YOUR_TOKEN'
},
// 如果后端设置了 Access-Control-Allow-Credentials: true,则需要添加此项
credentials: 'include', // 允许发送和接收Cookie等凭证
body: JSON.stringify({ key: 'value' }), // 示例:发送JSON数据
})
.then(response => {
// 检查响应状态码,处理HTTP错误
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
})
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Error:', error);
});解决PHP与J*aScript之间的CORS问题,核心在于理解同源策略、CORS机制,特别是预检请求(OPTIONS)的工作原理。通过在PHP后端正确配置Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等响应头,并对OPTIONS请求进行特殊处理并立即终止,可以有效地消除“Cross-Origin Request Blocked”错误,实现前后端的安全、顺畅通信。遵循本文提供的代码示例和最佳实践,将有助于构建更健壮、更安全的跨域Web应用。
以上就是解决PHP与J*aScript跨域请求(CORS)问题:一份全面的教程的详细内容,更多请关注php中文网其它相关文章!
# javascript
# 列表中
# 客户端
# 后端
# 您的
# 自定义
# a
# app
# 浏览器
# nginx
# apache
# json
# 前端
# js
# java
# php
# cookie
# 自己可以seo
# 白云高端网站建设价格
# 营销推广媒介有哪些
# 营销推广费科目
# 长乐网站优化推广
# 河源关键词排名软件
# 网店营销推广关键词
# 黑帽seo收录
# 清丰网站推广排名
# 智能营销获客推广
# 这是
# 是一个
# 编辑器
# 设置为
# 资源共享
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现
网易云音乐闹钟铃声设置教程
感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30
支付宝网页版在线入口 支付宝官网电脑登录入口
《新三国志曹操传》游历事件袁尚突围攻略
《桃源记2》资源采集攻略
知乎APP怎么查看自己被邀请的问题_知乎APP邀请回答记录查看与参与方法
J*aScript:从子元素中批量移除特定CSS类
《tt语音》超级玩家开通方法
荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复
J*aScript事件处理:优化键盘输入与表单提交的实践指南
微信步数怎么刷_微信步数快速提升技巧
Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南
优化Google Charts Gauge:在数据库无数据时显示默认值
Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧
realme 10 Pro息屏方案_realme 10 Pro省电策略
sublime如何自定义文件类型图标_AFileIcon插件的主题切换与个性化配置
Retrofit根路径POST请求:@POST("/") 的应用与解析
铁路12306怎么申请退票_铁路12306退票申请操作流程
小米手机截图后如何查看历史_小米手机截图历史记录查看方法
如何自定义苹果手机铃声
抖音网页版地址直接进入_抖音网页版在线观看入口
微信客户端如何找回密码_微信客户端忘记密码找回方法
空腹吃苹果好吗 苹果空腹摄入指南
《东方航空》添加乘机人方法
《书耽》更换手机号方法
电脑视频号|直播|如何分享屏幕
抖音火山版如何进行提现
《爱南宁》认证电动车方法
QQ网站入口直接登录 QQ官方正版登录页面
实时数据流中高效查找最小值与最大值
秋风萧瑟洪波涌起中的萧瑟指的是什么
抖音小程序怎么开通?小程序开通条件是什么?
被称为海蜈蚣的海洋动物是
《异星探险家》古怪的物品作用介绍
自定义你的VS Code状态栏,监控关键信息
天天漫画2025最新入口 天天漫画永久有效登录入口
拷贝漫画2025网页版入口 拷贝漫画官网免费看全集
睡觉时心跳快是什么原因 夜间心悸如何应对
顺丰快递在线查询系统 顺丰快递官方查单入口
AO3中文版手机快速通道_AO3最新稳定链接更新
《王者荣耀世界》英雄获取攻略
tiktok国际版入口_tiktok官网网页版链接
易车网官网直达入口 易车网在线登录入口
Golang如何使用log记录日志信息_Golang log日志记录方法总结
学习通网页版个人登录_学习通网页版个人账户登录入口
广州地铁app准妈咪徽章领取方法
《画加》约稿流程
掌握CSS :has() 选择器:父选择器、嵌套限制与常见陷阱解析
使用Google服务账号实现Google Drive API无缝集成与文件访问
2025-11-17
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。