CORS简介
Cross-Origin Resource Sharing(CORS)是由Web浏览器实现的安全功能,以确保网页默认情况下只能向其自己的域提出AJAX请求。但是,随着Web应用程序的发展以及需要从各种服务器中获取资源的需求,CORS就起到了作用。它允许服务器指定谁(哪个起源)可以访问其资产。
没有适当的CORS标头,浏览器将阻止来自不同起源的Ajax请求。
要求
- PHP 8
- 苗条4应用程序
- 有效的作曲家自动加载器
在Slim 4中添加CORS中间件
Slim 4,一种简约的PHP微型框架,提供中间件支持,以轻松添加CORS标头。 Slim中的中间件就像一系列层,您的应用程序通过该层发送请求。这样的一层可以负责添加CORS标题。
创建CORS中间件类
您可以使用Middlewares(PSR-15)来处理CORS标题。这是一个设置CORS标题的简单示例:
首先,处理所有“选项”(前飞行)请求,并带有空的响应,但让所有其他请求通过:
if ($request->getMethod() === 'OPTIONS') {
$response = new Response();
} else {
$response = $handler->handle($request);
}
然后添加特殊的CORS响应标头以允许请求:
$response = $response
->withHeader('Access-Control-Allow-Credentials', 'true')
->withHeader('Access-Control-Allow-Origin', '*')
->withHeader('Access-Control-Allow-Headers', '*')
->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS')
->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0')
->withHeader('Pragma', 'no-cache');
可选的手柄警告和通知,因此它们不会影响您的CORS标题。
if (ob_get_contents()) {
ob_clean();
}
然后返回响应:
return $response;
完整的CORS中间件类将如下实现。
文件:src/Middleware/CorsMiddleware.php
<?php
namespace App\Middleware;
use Nyholm\Psr7\Response;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
final class CorsMiddleware implements MiddlewareInterface
{
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler
): ResponseInterface {
if ($request->getMethod() === 'OPTIONS') {
$response = new Response();
} else {
$response = $handler->handle($request);
}
$response = $response
->withHeader('Access-Control-Allow-Credentials', 'true')
->withHeader('Access-Control-Allow-Origin', '*')
->withHeader('Access-Control-Allow-Headers', '*')
->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS')
->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0')
->withHeader('Pragma', 'no-cache');
if (ob_get_contents()) {
ob_clean();
}
return $response;
}
}
请确保为PSR-4设置您的composer.json
自动加载以识别名称空间。
// ...
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
集成中间件
添加此中间件 纤细错误处理程序中间件。
例如:
// ...
$app->addErrorMiddleware(true, true, true);
// Add CORS middleware
$app->add(CorsMiddleware::class);
// ...
结论
通过将CORS中间件集成到Slim 4应用程序中,您可以确保不同起源之间的平稳通信,主要是您的应用程序依赖于前端技术,例如React,Angular或Vue向Slim 4 API提出请求。始终保持谨慎,只允许必要的起源来确保您的应用程序安全。