在 Vercel 上的 Nextjs 应用中如何处理 CORS?

4

我目前正在使用我的第一个较大的 NextJS 应用程序,并遇到了经典的 CORS 问题。

我的后端托管在不同的服务器/url 上,我从这个后端获取我的 json 数据。我的前端是使用 NextJS 编写的,并部署在 Vercel 上。

我知道,我必须在后端和前端两侧都启用 CORS,在我的本地主机开发中,一切正常(甚至从后端获取数据)

我已经按照此指南:https://vercel.com/knowledge/how-to-enable-cors,启用了我的 NextJS 应用程序中的 CORS。我修改了 nextjs 配置:

module.exports = {
  async headers() {
    return [
      {
        source: "/.*",
        headers: [
          { key: "Access-Control-Allow-Credentials", value: "true" },
          { key: "Access-Control-Allow-Origin", value: "*" },
          { key: "Access-Control-Allow-Methods", value: "GET,OPTIONS,PATCH,DELETE,POST,PUT" },
          { key: "Access-Control-Allow-Headers", value: "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version" },
        ]
      }
    ]
  }
};

然而,当我将应用部署到 Vercel 上时,出现以下错误:
Access to fetch at 'https://<my-censored-backend-url>' from origin 'https://<my-frontend-url>.vercel.app' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

在我的后端(使用rails编写),我已经配置了vercel上的前端允许CORS。

你们有没有在CORS方面的经验,从不同的服务器获取NextJS数据?我正在使用getStaticProps、getServerSideProps和SWR进行获取。

如果有任何帮助,将不胜感激。


CORS头部对客户端(即HTTP请求方)没有任何作用。请使用浏览器的网络调试选项卡查看服务器目标返回的头部信息。 - Pointy
1
你在浏览器的开发工具中看到客户端请求中是否存在 'Access-Control-Allow-Origin' 头部? - juliomalves
所以,每个客户端请求都应该明确包含头部吗?目前我在nextjs.config中设置了头部。 CORS头部只与响应有关,对吗? - Andreas
嘿Andread,你找到解决办法了吗?我也遇到了同样的问题,我的网站无法从后端发出请求。 - krehwell
1
在我的情况下,实际上是后端问题。为了允许正确的页面,请只在CORS策略中写下域名,而不是整个URL。 例如:example.com而不是https://www.example.com。 - Andreas
显示剩余6条评论
1个回答

0

我认为NextJS有一个奇怪的问题,有时候它会随机抛出错误。

在我的情况下,如果URL不正确,它将抛出这个错误。 例如,我使用了“https://localhost:3000”,然后它就抛出了CORS错误。而且它可以用“http://localhost:3000”工作。

所以我的建议是仔细检查您正在使用的URL。 此外,请确保不要包含尾部斜杠,例如“http://localhost:3000/”可能无法正常工作。


3
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接