Laravel9+Angular14部署Plesk Centos后CORS策略失效求助
CORS错误求助:OPTIONS请求失败但实际XHR请求正常
我的应用持续返回CORS错误,尝试了网上各类方案仍未解决。
控制台错误:
从源'https://domain.nl'访问XMLHttpRequest到'https://api.domain/api/v1/status'被CORS策略阻止:预检请求的响应未通过访问控制检查:请求的资源上不存在'Access-Control-Allow-Origin'头。
main.js控制台错误:
"https://api.domain/api/v1/status的Http失败响应:0 Unknown Error"
奇怪的是:数据已加载并在应用中显示,似乎OPTIONS请求失败但实际XHR请求正常。
服务器环境
基于Plesk的CentOS服务器,运行PHP8.1,采用专用FPM应用,由Nginx提供服务;pm.max_children设置为20。
已尝试的解决方案
- 在Plesk>Apache&Nginx设置的HTTPS附加指令中添加头部:
Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "*" Header set Access-Control-Allow-Headers "*"
- 在Plesk>Apache&Nginx设置的附加Nginx指令中添加头部:
add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' '*'; add_header 'Access-Control-Allow-Headers' '*';
- 在Laravel中为所有路由添加cors中间件:
// 修改前: ->middleware('api','auth:sanctum') // 修改后: ->middleware('cors','api','auth:sanctum')
- 在Laravel中安装fruitcake/laravel-cors包
- 为所有response()返回添加头部:
return response() ->json(['Count'=>$result['count'], 'Result'=>$collection]) ->withCallback($request->input('callback')) ->header("Access-Control-Allow-Origin", "*");
- 修改cors.php配置:
// 修改前: 'allowed_origins_patterns' => [], // 修改后: 'allowed_origins_patterns' => ['*'], // 修改前: 'supports_credentials' => false, // 修改后: 'supports_credentials' => true,
以上方案均无效,请求帮助。
补充信息
- 开发环境运行正常(本地Angular localhost:4200连接同一服务器上的域名);
- 已多次执行
composer dump-autoload、artisan optimize和artisan cache:clear; - 经phpnl Slack咨询后新增方案:在Kernel.php中添加Laravel Cors中间件:
\App\Http\Middleware\Cors::class,
服务器日志持续出现错误:
2785#0: *3791483 peer closed connection in SSL handshake (104: Connection reset by peer) while SSL handshaking to upstream
已添加并重新颁发Let's Encrypt免费证书,问题仍存在。
前端请求代码
getRequest(url: string, requestParams: any = {}): Observable<any> { const headerDict = { 'Authorization': 'Bearer ' + environment.authData.plainTextToken, 'X-UserId': environment.authData.curUser['UserId'].toString() }; const requestOptions = { headers: new HttpHeaders(headerDict), params: requestParams }; return this.http.get(environment.apiUrl + url, requestOptions); }
相关截图说明
- 控制台截图:显示CORS错误提示及HTTP 0未知错误信息
- Plesk日志截图:展示SSL握手时上游连接重置的错误日志
- 网络标签页截图:呈现OPTIONS请求失败的状态详情
内容的提问来源于stack exchange,提问作者Ruud van de Ven
相关产品推荐
相关产品推荐

