laravel 6 无内置 options 请求封装,需用原生 curl 或 guzzle:curl 要设 curlopt_customrequest、curlopt_nobody 和 curlopt_header;guzzle 则调用 $client->request('options', ...) 并校验响应头。

Laravel 6 本身不提供“用 cURL 发送 OPTIONS 请求”的内置封装方法——cURL 是 PHP 底层函数,Laravel 只是基于它构建了更高层的 HTTP 客户端(如 Http facade,但该 facade 在 Laravel 6 中尚未引入,它是 Laravel 7+ 才加入的)。因此,在 Laravel 6 中发送 OPTIONS 请求,需直接使用原生 PHP 的 cURL 函数,或借助第三方 HTTP 客户端(如 Guzzle)。
下面分两种实用方式说明,重点清晰、可直接运行:
✅ 方式一:用原生 cURL 发送 OPTIONS 请求(零依赖)
这是最轻量、最可控的方式,适合调试或简单预检验证:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://your-app.test/api/users');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'OPTIONS'); // 显式指定 METHOD
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true); // 获取响应头(关键!用于验证 CORS)
curl_setopt($ch, CURLOPT_NOBODY, true); // 只要头,不要 body(符合 OPTIONS 语义)
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 开发环境可临时关闭证书校验
// 可选:添加 Origin 头,模拟浏览器预检
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Origin: http://localhost:3000',
'Access-Control-Request-Method: GET',
'Access-Control-Request-Headers: X-Requested-With, Authorization'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);
curl_close($ch);
echo "HTTP 状态码: {$httpCode}\n";
echo "响应头:\n{$headers}";
⚠️ 注意:
CURLOPT_NOBODY => true是关键,它让 cURL 只发请求头、不传请求体,完全匹配浏览器预检行为;CURLOPT_HEADER => true+ 手动截取头,才能看到Access-Control-Allow-Origin等 CORS 响应头是否返回。
Test Curl 2下载父母的功课——育儿心理学对话支持技能(心虫增强版)。提供结构化对话、情绪识别、场景匹配与安全检测;可选Python脚本(scripts/)在SKILL_DIR/data/本地存储评估历史、洞察与会话状态,不对外传输。核心路径:觉察(看见防御)→接纳(慈悲是……
✅ 方式二:用 Guzzle 发送(推荐用于测试/集成场景)
Laravel 6 支持 Guzzle(v6 或 v7),更简洁、健壮,且自动处理重试、超时、错误分类:
-
安装 Guzzle(如未安装):
composer require guzzlehttp/guzzle:^6.5
-
在控制器或 Artisan 命令中使用:
use GuzzleHttp\Client; $client = new Client(); try { $res = $client->request('OPTIONS', 'http://your-app.test/api/posts', [ 'headers' => [ 'Origin' => 'http://localhost:3000', 'Access-Control-Request-Method' => 'POST', ], 'timeout' => 5, ]); echo "状态码: " . $res->getStatusCode() . "\n"; echo "Allow-Origin: " . $res->getHeaderLine('Access-Control-Allow-Origin') . "\n"; echo "Allow-Methods: " . $res->getHeaderLine('Access-Control-Allow-Methods') . "\n"; } catch (\GuzzleHttp\Exception\RequestException $e) { if ($e->hasResponse()) { echo "错误响应码: " . $e->getResponse()->getStatusCode(); } else { echo "网络连接失败"; } }
❗关键提醒(Laravel 6 特别注意)
- Laravel 6 没有
Http::options()方法,该语法从 Laravel 7 才开始支持; - 不要用
Route::options()来“发送”请求——它是定义服务端如何响应 OPTIONS 请求,不是客户端调用方式; - 若你实际想“测试自己的 Laravel 6 接口是否正确响应 OPTIONS”,上面两种 cURL / Guzzle 调用就是标准手段;
- 验证成功与否,不看状态码是不是 200,而要看响应头是否含合法 CORS 字段,例如:
Access-Control-Allow-Origin: http://localhost:3000Access-Control-Allow-Methods: GET, POST, OPTIONSAccess-Control-Allow-Headers: X-Requested-With, Authorization
不复杂但容易忽略。











