如何解决“预检无效(重定向)”或“预检请求不允许重定向”

2024-01-25

我已按照此步骤设置我的服务器以启用 CORS。https://learn.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api https://learn.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api

但现在在我的浏览器开发控制台中,我看到以下错误消息:

XMLHttpRequest 无法加载https://服务器地址/abc https://serveraddress/abc。回应 预检无效(重定向)

你知道我能做什么来解决它吗?我正在 HTTPS 中发出 CORS 请求。我认为这导致了“预检无效(重定向)”失败。但我不知道为什么或是什么重定向了 OPTIONS 请求。

谢谢。


简短回答:确保代码中的请求 URL 没有缺少尾部斜杠。

缺少尾部斜杠问题是问题中引用的错误的最常见原因。

但这不是only原因——只是最常见的。请阅读以获得更多详情。

当您看到此错误时,这意味着您的代码正在触发浏览器发送CORS 预检OPTIONS request https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests,并且服务器响应3xx重定向。为了避免错误,您的请求需要获得2xx相反,成功响应。

您也许可以调整代码以避免触发浏览器发送OPTIONS要求。

就本例中发生的情况而言,了解浏览器在以下情况下执行 CORS 预检非常重要:

  • 请求方法不是GET, HEAD, or POST
  • 您设置了除以下之外的自定义请求标头Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, or Width
  • the Content-Type请求标头的值不是application/x-www-form-urlencoded, multipart/form-data, or text/plain

如果您无法更改代码以避免浏览器执行预检,另一个选择是:

  1. 检查中的 URLLocation响应中的响应头OPTIONS要求。
  2. 更改您的代码以直接向其他 URL 发出请求。

网址之间的差异可能就像路径中的尾部斜杠一样简单 - 例如,您可能需要更改代码中的网址以添加尾部斜杠 - 例如,http://localhost/api/auth/login/(注意结尾的斜杠)而不是http://localhost/api/auth/login(没有尾部斜杠)——或者您可能需要删除尾部斜杠。

您可以使用浏览器开发工具中的网络窗格来检查对OPTIONS请求并在值中查找重定向 URLLocation响应头。


但是,在某些情况下,以下所有情况均成立:

  • 你无法避免飞行前检查OPTIONS
  • 您无法对请求 URL 进行任何调整
  • 您无法将请求 URL 替换为完全不同的 URL

具有这些条件的常见情况是,当您尝试使用某些需要 OAuth 或 SSO 工作流程的第三方端点时,该工作流程不打算从前端代码中使用。

在这种情况下(实际上在所有情况下),需要认识到的是,对预检的响应必须来自前端代码发送请求的同一来源。

因此,即使您创建了您控制的服务器端代理:

  1. 如果您的浏览器发送预检OPTIONS向您的代理请求。
  2. 您已配置代理,使其仅将请求重定向到第 3 方端点。
  3. 因此,您的前端最终会直接从该第三方端点接收响应。

…那么预检就会失败。

在这种情况下,最终您唯一的选择是:确保预检不仅仅重定向到第 3 方端点,而是您自己的服务器端(代理)代码接收来自该端点的响应,使用它,然后发送响应它自己的返回到您的前端代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决“预检无效(重定向)”或“预检请求不允许重定向” 的相关文章

随机推荐