You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js搭配WPGraphQL调用useQuery出现CORS跨域问题如何解决?

问题根源排查

首先你当前的配置存在2个核心错误:

  • Access-Control-Allow-Origin、Access-Control-Allow-Credentials属于服务端响应头,放在客户端请求头中完全无效,反而会触发额外的预检请求校验
  • fetchOptions中设置的mode: 'no-cors'不支持携带Authorization这类自定义请求头,也会导致浏览器限制读取响应内容,是触发客户端请求失败的直接原因
    另外getStaticProps/getServerSideProps是在Next.js服务端发起的请求,不受浏览器同源策略限制,所以无论配置是否正确都能正常拉取数据,只有浏览器端执行的useQuery请求会触发CORS校验。
解决方案

第一步:修正Apollo Client配置

删除无效配置项,保留必要参数即可:

const httpLink = createHttpLink({
  uri: process.env.NEXT_PUBLIC_WP_API_URL,
  headers: {
    'Authorization': process.env.NEXT_PUBLIC_WP_AUTHORIZATION,
    'Content-Type': 'application/json',
  },
  credentials: 'include'
})
const client = new ApolloClient({
    link: httpLink,
    cache: new InMemoryCache()
});

第二步:配置WordPress侧CORS规则

需要在WordPress服务端添加跨域头配置,推荐将以下代码加入当前WordPress主题的functions.php文件中:

add_action('graphql_process_http_request_response', function($response, $result, $operation, $request_params) {
    // 生产环境请替换为你的正式前端域名
    $allowed_origin = 'http://localhost:3000';
    if (isset($_SERVER['HTTP_ORIGIN']) && $_SERVER['HTTP_ORIGIN'] === $allowed_origin) {
        header("Access-Control-Allow-Origin: {$allowed_origin}");
        header("Access-Control-Allow-Credentials: true");
        header("Access-Control-Allow-Methods: POST, OPTIONS");
        header("Access-Control-Allow-Headers: Content-Type, Authorization");
    }
    // 处理预检OPTIONS请求
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        status_header(200);
        exit();
    }
    return $response;
}, 10, 4);

如果使用Apache/Nginx做Web服务,也可以直接在服务器配置中添加上述CORS头规则,效果一致。

内容的提问来源于stack exchange,提问作者benjdan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:36:00