【问题标题】:Fetching wp_mail has been blocked by CORS policy获取 wp_mail 已被 CORS 策略阻止
【发布时间】:2022-01-25 17:58:16
【问题描述】:

我正在使用 Nextjs 构建一个无头 wordpress 网站。我正在尝试对我的 wordpress CMS 进行 api 调用。

从 wordpress 获取数据时,我无法通过 cors。真的找不到将 Access-Control-Allow-Origin 添加到我的 api 调用的方法。我一直在尝试这样做,但仍然出现 CORS 错误。

$headers = array('Access-Control-Allow-Origin: *; Content-Type: application/json; Accept: application/json');

wp_mail('test@mail.com', 'subject', 'msg', $headers);

【问题讨论】:

  • 你能澄清你的问题是什么吗?您是如何得出 CORS 在这里引起问题的结论的? CORS 是一种旨在保护浏览器用户的前端安全机制; CORS 应该对您使用 PHP 从后端服务调用 API 的能力产生零影响。 “从 wordpress 获取数据时,我无法通过 cors” 您提供的代码绝对不会进行任何类型的获取;你贴错代码了吗?
  • @esqew — OP 表示调用来自 Next.js(这是一个用于创建由 SSR 支持的 SPA 的框架),因此请求来自可能在浏览器上运行的 JS 或服务器。
  • @Quentin Fair 点;在我对书面问题的解释中,我想包含术语“headless...site”会排除任何类型的基于浏览器的执行。此外,如果问题确实出在前端,那么 OP 对 PHP 代码的进一步包含充其量是令人困惑的。
  • @esqew — 一个无头的 wordpress 网站是一个不使用 WordPress 生成以用户为中心的网站的网站。相反,您将 WordPress 管理站点用作 CMS 并从 API 访问数据。

标签: javascript php wordpress


【解决方案1】:

您正在处理的标头都不是 SMTP 标头。他们不应该靠近wp_mail 函数。

CORS 响应标头 (Access-Control-Allow-*) 是 HTTP 响应标头

通常使用 PHP,您需要使用 the header() function 将它们添加到 HTTP 响应中。

header("Access-Control-Allow-Origin: *");

由于您使用的是 WordPress(我不太熟悉),请查看 this answer,因为它似乎将自己包裹在普通的标头 API 周围。

Content-Type: application/json 可能是 HTTP 请求 响应标头。从上下文中不清楚,因为您的代码 sn-p 不包含读取请求正文或生成响应正文的任何​​内容。

Accept: application/json是一个HTTP请求头,需要从浏览器发送到服务器。你根本不应该在 PHP 中设置它。

【讨论】:

  • 嗯,这很有道理,我会试试这个。谢谢!
【解决方案2】:

几个月前我也遇到过同样的问题。

通过将以下代码添加到functions.php来修复它

  // Allow from any origin
  if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
  }

  // Access-Control headers are received during OPTIONS requests
  if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
      // may also be using PUT, PATCH, HEAD etc
      header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
      header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    exit(0);
  }

【讨论】:

    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2021-10-13
    • 2019-11-01
    • 2023-04-10
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多