返回

如何修复“由于 CORS 策略,XMLHttpRequest 访问已被阻止”错误?

vue.js

修复“由于 CORS 策略,XMLHttpRequest 访问已被阻止”错误:详尽指南

简介

在使用 Axios 和 Laravel 构建应用程序时,开发人员可能会遇到“由于 CORS 策略,XMLHttpRequest 访问已被阻止”的错误。此错误表明浏览器阻止了跨域请求,这会阻碍应用程序与 API 的交互。本文将提供一个全面的指南,帮助开发人员解决此问题。

原因:跨域资源共享 (CORS)

CORS 是一种安全机制,可防止未经授权的跨源脚本访问(例如,恶意网站无法从另一个域读取或写入数据)。当浏览器检测到跨域请求时,它将发送预检请求以检查服务器是否允许该请求。如果服务器响应预检请求的响应标头中未包含适当的 CORS 标头,则浏览器将阻止实际请求。

解决方法

1. 启用 CORS 头

在 Laravel 控制器中添加以下代码以启用 CORS 头:

public function __construct()
{
    $this->middleware('cors');
}

config/cors.php 中配置 cors 中间件:

'paths' => ['/*'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 3600,
'supports_credentials' => true,

2. 配置 Axios

在 Vue.js 应用程序的 main.js 中,配置 Axios 实例以发送 CORS 头:

axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*';
axios.defaults.headers.common['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept';

3. 正确设置预检请求

确保预检请求正在发送正确的标头。将以下标头添加到预检请求中:

Origin: http://localhost:8080
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type, Accept

4. 检查重定向设置

确保 API 端点未重定向到另一个 URL。如果重定向,则需要配置服务器以允许对预检请求进行重定向。

5. 检查标头限制

确保服务器端未对响应标头大小或数量施加任何限制。如果存在限制,则可能需要增加它们或使用不同的标头。

6. 禁用浏览器扩展

某些浏览器扩展可能会干扰 CORS 请求。尝试禁用任何已安装的扩展程序并重新加载应用程序以查看是否解决了问题。

7. 检查 HTTP 方法

确保向 API 端点发送的 HTTP 方法是允许的。OPTIONS 方法用于预检请求,而其他方法(例如 POST)用于实际请求。

常见问题解答

1. 如何知道我的应用程序是否正在发送预检请求?

使用浏览器的开发人员工具检查网络请求。预检请求将具有 OPTIONS 方法,而实际请求将具有不同的方法(例如 POST 或 GET)。

2. 为什么我看到“预检请求失败”错误?

此错误通常是由 CORS 头配置不正确引起的。请检查您已正确设置标头,并且服务器响应中包含正确的 CORS 头。

3. 我需要在所有 Laravel 路由上启用 CORS 吗?

只有需要进行跨域请求的路由才需要启用 CORS。如果您在整个应用程序中使用 CORS,则可以将中间件添加到全局 web 中间件组中。

4. Axios 能自动发送预检请求吗?

是的,Axios 会自动发送预检请求,前提是服务器响应中包含正确的 CORS 标头。

5. CORS 策略可以为特定域设置吗?

是的,可以使用 allowed_origins 配置选项为特定域启用 CORS。

结论

通过遵循本文中概述的步骤,开发人员可以有效地解决“由于 CORS 策略,XMLHttpRequest 访问已被阻止”错误。通过正确配置服务器和客户端,跨域请求可以顺利进行,从而确保应用程序能够与 API 无缝交互。