在线 CORS 测试器:诊断跨域资源共享问题

· 12分钟阅读

目录

理解 CORS 及其重要性

跨域资源共享(CORS)是在网络浏览器中实现的一种安全机制,用于控制网络应用程序如何从不同来源请求资源。可以把它想象成俱乐部的保安——它根据一套特定的规则决定谁能进来,谁不能进来。

默认情况下,浏览器执行同源策略(SOP),该策略阻止在一个域上运行的 JavaScript 访问另一个域上的资源。这是一项基本的安全功能,可以保护用户免受恶意脚本的侵害。然而,现代网络应用程序通常需要与托管在不同域上的 API 和服务进行通信,这就是 CORS 发挥作用的地方。

CORS 提供了一种标准化的方式,让服务器告诉浏览器:"是的,这个特定的网站可以访问我的资源。"如果没有正确的 CORS 配置,合法的跨域请求将被阻止,从而破坏您的网络应用程序的功能。

专业提示:CORS 是浏览器强制执行的安全功能。像 cURL 或 Postman 这样的工具不会遇到 CORS 问题,因为它们不是浏览器。始终在实际的浏览器环境中测试 CORS 配置。

考虑一个真实场景:您正在构建一个电子商务平台,前端托管在 https://myshop.com,但您的产品库存 API 位于 https://api.inventory-service.com。如果没有 CORS 标头,您的前端 JavaScript 将无法获取产品数据,让您的客户盯着空货架。

在以下情况下,CORS 变得更加关键:

CORS 工作原理:技术深入探讨

了解 CORS 的底层工作原理有助于您更有效地诊断问题。CORS 机制涉及两种类型的请求:简单请求和预检请求。

简单请求

简单请求是满足以下所有条件的请求:

对于简单请求,浏览器直接发送带有 Origin 标头的请求。服务器使用 Access-Control-Allow-Origin 标头响应,指示是否允许该来源。如果标头与请求来源匹配(或设置为 *),浏览器允许 JavaScript 代码读取响应。

预检请求

任何不符合简单请求条件的请求都会触发预检请求。这是浏览器在实际请求之前发送的 OPTIONS 请求,用于检查是否理解 CORS 协议以及实际请求是否安全发送。

预检请求包括以下标头:

服务器必须使用适当的 CORS 标头响应预检,指示允许什么。只有在预检成功后,浏览器才会发送实际请求。

快速提示:预检请求可能会影响性能。使用 Access-Control-Max-Age 标头缓存预检响应,减少服务器需要处理的 OPTIONS 请求数量。

常见 CORS 问题和错误消息

CORS 错误是开发人员遇到的最令人沮丧的问题之一。让我们分解最常见的问题及其实际含义。

缺少 Access-Control-Allow-Origin 标头

这是您会看到的最常见的 CORS 错误。浏览器控制台将显示类似以下内容:

从来源 'https://myapp.com' 访问 'https://api.example.com/data' 的 fetch 已被 CORS 策略阻止:请求的资源上不存在 'Access-Control-Allow-Origin' 标头。

这意味着服务器在其响应中没有包含所需的 CORS 标头。修复方法很简单:配置您的服务器发送带有特定来源或公共 API 的 *Access-Control-Allow-Origin 标头。

HTTP 方法不正确

当您尝试使用服务器未明确允许的 HTTP 方法时,您会看到类似以下的错误:

从来源 'https://myapp.com' 访问 'https://api.example.com/data' 的 fetch 已被 CORS 策略阻止:预检响应中的 Access-Control-Allow-Methods 不允许方法 PUT。

这发生在预检阶段。您的服务器需要在 Access-Control-Allow-Methods 标头中包含 HTTP 方法。

不支持凭据

如果您尝试发送 cookie 或身份验证标头,但服务器未配置,您会遇到:

从来源 'https://myapp.com' 访问 'https://api.example.com/data' 的 fetch 已被 CORS 策略阻止:当请求的凭据模式为 'include' 时,响应中 'Access-Control-Allow-Credentials' 标头的值为 '',必须为 'true'。

要解决此问题,服务器必须发送 Access-Control-Allow-Credentials: true,重要的是,当涉及凭据时不能使用 Access-Control-Allow-Origin: *——它必须指定确切的来源。

不允许自定义标头

现代应用程序通常使用自定义标头来存储 API 密钥、身份验证令牌或其他元数据。如果这些未明确允许,您会看到:

预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 x-api-key。

解决方案是在 Access-Control-Allow-Headers 响应标头中包含您的自定义标头。

错误类型 常见原因 快速修复
无 Access-Control-Allow-Origin 服务器未配置 CORS 将标头添加到服务器响应
不允许的方法 HTTP 方法不在允许列表中 更新 Access-Control-Allow-Methods
不支持凭据 缺少凭据标头 设置 Access-Control-Allow-Credentials: true
不允许的标头 自定义标头未列入白名单 添加到 Access-Control-Allow-Headers
通配符与凭据 在凭据模式下使用 * 指定确切来源而不是 *

有效使用 CORS 测试器

CORS 测试器是诊断跨域问题的宝贵工具,无需编写代码。它模拟浏览器请求,并准确显示正在发送和接收的 CORS 标头。您可以使用我们的 CORS 测试器快速诊断问题。

优秀的 CORS 测试器应该做什么

有效的 CORS 测试工具应提供:

逐步测试过程

以下是如何有效使用 CORS 测试器:

  1. 输入要测试的 API 端点 URL
  2. 指定将发出请求的来源(您的前端域)
  3. 选择您的应用程序将使用的 HTTP 方法
  4. 添加您的应用程序发送的任何自定义标头(如 Authorization 或 X-API-Key)
  5. 运行测试并检查结果
  6. 查看响应标头以查看实施了哪些 CORS 策略
  7. 识别需要在服务器上配置的缺失或不正确的标头

专业提示:始终使用您的生产应用程序将使用的确切来源进行测试。某些服务器具有特定于来源的 CORS 配置,可能适用于 localhost 但对您的生产域失败。

解释测试结果

运行 CORS 测试时,请注意以下关键指标:

您还可以使用我们的 HTTP 标头分析器获取所有正在发送和接收的标头的详细分类,这完美地补充了 CORS 测试。

诊断 CORS 问题的实际示例

示例 1:社交媒体集成

假设您正在构建一个社交媒体仪表板,该仪表板聚合来自多个平台的帖子。您在 https://dashboard.example.com 的前端需要从 https://api.socialmedia.com 获取数据。

您正在发出 POST 请求以创建新帖子,但您一直收到 CORS 错误。以下是如何诊断它:

  1. 打开您的 CORS 测试器并输入 https://api.socialmedia.com/posts
  2. 将来源设置为 https://dashboard.example.com
  3. 选择 POST 作为方法
  4. 添加 Content-Type 标头:application/json
  5. 添加您的 Authorization 标头:Bearer your-token-here
  6. 运行测试

测试显示服务器仅允许 GET 请求。Access-Control-Allow-Methods 标头显示:GET, HEAD, OPTIONS。您需要联系 API 提供商以启用 POST 请求,或检查是否有用于创建帖子的不同端点。

示例 2:电子商务库存系统

您在 https://shop.example.com 的电子商务网站从 https://inventory.example.com 提取库存数据。API 需要自定义标头 X-Shop-ID 来识别哪个商店正在发出请求。

测试显示错误:"预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 x-shop-id。"