
本教程深入探讨了Web开发中常见的跨域资源共享(CORS)问题,特别是当J*aScript通过Fetch API请求PHP后端时遇到的挑战。文章详细解释了CORS机制、预检请求(OPTIONS)的处理,并提供了PHP服务器端配置CORS响应头的完整示例代码,指导开发者如何正确配置Access-Control-Allow-Origin、Access-Control-Allow-Methods等,以确保跨域请求成功。
跨域资源共享(Cross-Origin Resource Sharing, CORS)是一种浏览器安全机制,旨在允许网页从不同域(协议、域名或端口)请求资源。由于浏览器的同源策略(Same-Origin Policy)限制,默认情况下,J*aScript只能与同源的服务器进行交互。当前端应用(例如运行在 http://localhost:3000)尝试向不同源的后端API(例如 https://api.example.com)发送请求时,浏览器会触发CORS机制,并要求服务器明确授权该跨域请求。如果服务器未正确配置CORS响应头,浏览器将阻止请求,并抛出“Cross-Origin Request Blocked”错误。
CORS请求主要分为两种类型:
为了正确处理CORS请求,服务器需要在响应中包含一系列Access-Control-*头:
以下是一个PHP后端正确配置CORS以处理J*aScript跨域请求的示例。该示例着重于处理OPTIONS预检请求,并动态设置Access-Control-Allow-Origin。
AI at Meta
Facebook 旗下的AI研究平台
72
查看详情
<?php
class ControllerCustomapiTest extends Controller {
public function index() {
// 1. 设置Access-Control-Allow-Origin
// 优先使用HTTP_ORIGIN头来确定请求来源,并动态设置允许的来源
// 建议在这里维护一个允许的来源白名单,以增强安全性
if (isset($_SERVER['HTTP_ORIGIN'])) {
$origin = $_SERVER['HTTP_ORIGIN'];
// 示例:可以根据白名单判断是否允许该来源
// $allowedOrigins = ['http://localhost:4200', 'https://your-frontend-domain.com'];
// if (in_array($origin, $allowedOrigins)) {
// header("Access-Control-Allow-Origin: " . $origin);
// } else {
// // 如果来源不在白名单中,可以拒绝请求
// http_response_code(403);
// die('Forbidden Origin');
// }
header("Access-Control-Allow-Origin: " . $origin); // 简化示例:允许任何发送HTTP_ORIGIN的来源
} else {
// 如果没有HTTP_ORIGIN头(通常是同源请求或某些非浏览器请求),
// 可以设置一个默认的允许来源,或者根据实际情况设置为 '*' (谨慎使用)
header("Access-Control-Allow-Origin: *"); // 生产环境请务必替换为具体域名
}
// 2. 设置Access-Control-Allow-Credentials (如果需要发送Cookie或认证头)
header('Access-Control-Allow-Credentials: true');
// 3. 设置Access-Control-Max-Age (缓存预检请求结果,单位:秒)
header('Access-Control-Max-Age: 86400'); // 缓存1天
// 4. 处理预检 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']}");
}
// 预检请求成功,返回204 No Content状态码并终止脚本
http_response_code(204);
die();
}
// 5. 处理实际请求 (GET, POST, PUT, DELETE 等)
// 设置响应内容类型为JSON
header('Content-Type: application/json');
// 构建并发送JSON响应
$response = array('success' => true, 'message' => '数据已成功接收');
echo json_encode($response);
}
}
?>代码解释:
前端J*aScript代码通常不需要为CORS做特殊处理,只需按照常规方式发送请求即可。浏览器会自动处理预检请求和CORS验证。
const url = 'https://opecart9349.000webhostapp.com/unzipper/opencart/index.php?route=customapi/test'; // 替换为你的PHP后端URL
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json', // 触发非简单请求,需要预检
// 'Authorization': 'Bearer your_token_here' // 如果需要发送认证头,服务器也需在Allow-Headers中允许
},
body: JSON.stringify({ name: 'John Doe', age: 30 }) // 示例数据
})
.then(response => {
// 检查HTTP状态码,处理非2xx响应
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
})
.then(data => {
console.log('Success:', data);
})
.catch(error => {
console.error('Error:', error);
});跨域资源共享(CORS)是Web开发中不可避免的一部分。正确理解CORS机制,特别是预检请求的作用,并按照本文提供的PHP后端配置示例,可以有效地解决“Cross-Origin Request Blocked”错误。核心在于服务器端要明确告知浏览器,哪些跨域请求是被允许的,以及允许哪些方法、头和来源。通过细致的配置和严谨的安全考量,可以确保您的Web应用在不同域之间安全、顺畅地通信。
以上就是解决跨域资源共享(CORS)问题:PHP与J*aScript实战教程的详细内容,更多请关注php中文网其它相关文章!
# javascript
# php
# a
# app
# 浏览器
# cookie
# nginx
# apache
# json
# 前端
# js
# java
# 高原seo优化公司
# 什么是网站建设和优化
# 荣昌县网站建设建议
# 中国旅游局推广网站
# 是一个
# 南京百度营销推广
# 正确处理
# 编辑器
# 可选
# 在此
# 这是
# 后端
# 设置为
# 资源共享
# 自定义
# gmc网站建设费用
# 保定网站建设服务器
# 黄页网站推广方案
# php网站建设成都
# 网站建设与推广认可l火17星热情
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
mysql怎么查询数据_mysql基础查询语句使用教程
邮政快递寄件查询入口 邮政快递收件查询入口
键盘保修需要什么_键盘售后维修流程
Apple Music无故扣费引质疑
如何在CSS中清除浮动解决背景颜色不包裹内容问题_clear after技巧
发博客与长微博技巧
如何自定义苹果手机铃声
在J*a中如何实现在线问答与评分系统_问答评分项目开发方法说明
小米civi如何设置锁屏时间
《兴业银行》注册登录方法
什么是Satis,如何用它搭建一个私有的composer仓库?
c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化
j*a中ArrayBlockingQueue的使用
J*aScript实现下拉菜单驱动的动态表格数据展示
如何查询个人病历记录
天堂漫画网页版在线阅读 天堂漫画手机版入口
126邮箱网页在线登录2025_126邮箱网页版入口官方地址
智学网app怎么登录忘记密码_智学网app忘记密码找回与重新登录操作方法
Google Drive API服务器端访问指南:服务账户认证详解
小红书网页版首页入口 小红书网页版电脑端官方登录链接
J*aScript:从子元素中批量移除特定CSS类
《全民k歌》网页版最新登录入口一览
口腔诊所管理软件推荐
汽车之家网页版免费登录_汽车之家官网首页直接进入
mysql如何回滚事务_mysql ROLLBACK事务回滚方法
雨课堂官网在线登录 网页版雨课堂登录链接
德邦物流在线查询系统 德邦快递货物运输追踪
创客贴登录页面入口 创客贴网页版最新网址链接
韩剧圈正版官网入口_韩剧圈官方指定登录
C++ switch case字符串_C++如何实现字符串switch匹配
抖音官网入口快速访问 抖音网页版账号注册解析
智云Q3和Q2有什么升级_智云Q3与Q2手持云台功能与性能对比分析
5G和6G的连接密度有什么区别 6G每平方公里能连接多少设备
Go Template中优雅处理循环最后一项:自定义函数实践
《领英》查看屏蔽名单方法
《荔枝fm》导出文件教程
奥克斯空调不制热啥毛病_奥克斯空调不制热原因分析及解决技巧
《桃源记2》资源采集攻略
喜茶GO更换登录账号方法
12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧
如何通过settings.json个性化您的VS Code体验
Lar*el Eloquent中通过Join查询关联数据表:解决多行子查询问题
在VS Code中利用AI辅助进行代码迁移
XPath动态元素定位:如何精准选择文本内容变化的元素
在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享
抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?
重返未来:1999卡戎全方位攻略
Golang如何实现HTTP请求重试机制_Golang HTTP请求错误处理策略
Vue 3中独立响应式实例的创建与应用
小红书网页版怎么进 小红书网页版通用入口
2025-11-17
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。