Composer在线学习地址:学习地址
想象一下,你正在开发一个全新的项目,前端使用了流行的 vue.js 框架,后端则是一个基于 php 的 restful api。开发初期,一切顺利,但在部署到不同环境后,或者本地开发时前端跑在
localhost:8080
localhost:80
localhost:8000
当你尝试从 Vue 应用中发送一个简单的
GET
POST
Access to XMLHttpRequest at 'http://localhost:8000/api/data' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
这就是典型的跨域请求(Cross-Origin Resource Sharing, CORS)问题。简单来说,出于安全考虑,浏览器限制了来自一个源(协议、域名、端口)的脚本向另一个源发起 HTTP 请求。如果你的前端和后端不在同一个源,就需要后端明确告知浏览器允许跨域访问。
最初遇到这个问题时,我们尝试了各种“土办法”:
header('Access-Control-Allow-Origin: *');header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');*
OPTIONS
OPTIONS
OPTIONS
这些方法不仅效率低下,而且容易遗漏,导致CORS问题反复出现,极大地影响了开发效率和项目进度。我们急需一个更优雅、更标准、更易于管理的解决方案。
neomerx/cors-psr7
正当我们焦头烂额之际,我们发现了
neomerx/cors-psr7
第一步:通过 Composer 轻松安装
使用 Composer 安装
neomerx/cors-psr7
<pre class="brush:php;toolbar:false;">composer require neomerx/cors-psr7
Composer 会自动下载并管理这个包及其依赖,你无需关心文件路径或手动引入,一切都变得井井有条。
第二步:集成 neomerx/cors-psr7
neomerx/cors-psr7
以下是一个简化的示例,展示了如何在你的 PHP 应用中集成
neomerx/cors-psr7
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php'; // 引入 Composer 自动加载
use Neomerx\Cors\Analyzer;
use Neomerx\Cors\Contracts\AnalysisResultInterface;
use Neomerx\Cors\Strategies\Settings;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Psr7\Response; // 假设你使用 Guzzle PSR-7 响应
// 模拟一个处理请求的函数,实际中可能是你的路由或控制器
function handleRequest(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
// 这里是你的业务逻辑,例如返回一些 JSON 数据
$response->getBody()->write(json_encode(['message' => 'Hello from API!']));
return $response->withHeader('Content-Type', 'application/json');
}
// 1. 定义 CORS 策略设置
$corsSettings = (new Settings())
->setServerOrigin('http', 'localhost', 8000) // 你的API服务器地址
->setPreFlightCacheMaxAge(86400) // 预检请求结果缓存一天
->setCredentialsSupported() // 允许携带 Cookie 等凭证
->setAllowedOrigins(['http://localhost:8080', 'https://your-frontend.com']) // 允许的前端域名
->setAllowedMethods(['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']) // 允许的HTTP方法
->setAllowedHeaders(['Content-Type', 'Authorization', 'X-Requested-With']) // 允许的请求头
->setExposedHeaders(['X-Custom-Header']); // 允许浏览器访问的响应头
// 2. 实例化 CORS 分析器
$corsAnalyzer = Analyzer::instance($corsSettings);
// 3. 获取当前的请求 (实际中可能从你的框架或 PSR-7 ServerRequestFactory 获取)
// 这里我们模拟一个请求,你需要替换为实际的请求对象
$request = GuzzleHttp\Psr7\ServerRequest::fromGlobals();
// 4. 分析请求的 CORS 类型
$corsResult = $corsAnalyzer->analyze($request);
// 5. 根据分析结果处理请求
switch ($corsResult->getRequestType()) {
case AnalysisResultInterface::ERR_NO_HOST_HEADER:
case AnalysisResultInterface::ERR_ORIGIN_NOT_ALLOWED:
case AnalysisResultInterface::ERR_METHOD_NOT_SUPPORTED:
case AnalysisResultInterface::ERR_HEADERS_NOT_SUPPORTED:
// CORS 策略不通过,返回 4xx 错误
$response = (new Response(403))->withHeader('Content-Type', 'text/plain');
$response->getBody()->write('Forbidden: CORS policy violation.');
break;
case AnalysisResultInterface::TYPE_PRE_FLIGHT_REQUEST:
// 预检请求 (OPTIONS),返回 200 并带上 CORS 响应头
$response = new Response(200);
foreach ($corsResult->getResponseHeaders() as $name => $values) {
foreach ($values as $value) {
$response = $response->withAddedHeader($name, $value);
}
}
break;
case AnalysisResultInterface::TYPE_REQUEST_OUT_OF_CORS_SCOPE:
// 非跨域请求,直接进入业务逻辑
$response = handleRequest($request, new Response());
break;
default:
// 实际的跨域请求,先执行业务逻辑,再添加 CORS 响应头
$response = handleRequest($request, new Response());
foreach ($corsResult->getResponseHeaders() as $name => $values) {
foreach ($values as $value) {
$response = $response->withAddedHeader($name, $value);
}
}
break;
}
// 发送响应
foreach ($response->getHeaders() as $name => $values) {
foreach ($values as $value) {
header(sprintf('%s: %s', $name, $value), false);
}
}
http_response_code($response->getStatusCode());
echo (string) $response->getBody();
通过上述代码,我们可以看到
neomerx/cors-psr7
Settings
Analyzer::instance($settings)->analyze($request)
Access-Control-*
Settings
neomerx/cors-psr7
引入
neomerx/cors-psr7
Settings
CORS 确实是现代 Web 开发中一个绕不开的难题,但它绝不应该成为你开发效率的绊脚石。通过 Composer 引入
neomerx/cors-psr7
neomerx/cors-psr7
以上就是如何优雅地解决跨域请求(CORS)问题:使用Composer轻松集成neomerx/cors-psr7的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号