由于 Chrome 中缺少预检请求而阻止 HTTP 重定向

Mic*_*ter 4 redirect google-chrome angular

我们目前正在构建一个由 RESTful API 支持的 Angular 应用程序。该应用程序尝试使用以下请求 URL 获取用户的信息:http://example.com:1337/api/users/1。该资源使用 HTTP 301(永久移动)进行响应,并设置资源已移动到的位置标头,例如Location=http://another-hostname.com:8088/new/users/1。Angular 的 HTTP 客户端或者更确切地说是浏览器正在自动处理此响应并重定向到这个新位置。

遗憾的是,在 Chrome 中我们收到以下错误消息:

XMLHttpRequest cannot load http://example.com:1337/api/users/1. Redirect from 'http://example.com:1337/api/users/1' to 'http://another-hostname.com:8088/new/users/1' has been blocked by CORS policy: Request requires preflight, which is disallowed to follow cross-origin redirect.
Run Code Online (Sandbox Code Playgroud)

Chrome 在调用新资源的 GET 之前会跳过预检请求 (CORS)。我们用 Firefox 对此进行了测试,效果非常好。Firefox 发出新的预检请求,之后的 GET 请求将被成功处理。

所以,我想知道这里正确的行为是什么。有人有过 30 倍回复的类似经历吗?

是否可以禁用自动浏览器(或 Angular HTTP 客户端)重定向处理?这样我们就可以用全新的this.http.get(...).

感谢您的任何建议,

迈克尔

小智 5

Chrome 在调用新资源的 GET 之前会跳过预检请求 (CORS)。我们用 Firefox 对此进行了测试,效果非常好。Firefox 发出新的预检请求,之后的 GET 请求将被成功处理。

您可以在此处找到有关此问题的讨论以及其他解决方法,以及指向 CORS 的 W3C 建议的相应部分的链接: https: //stackoverflow.com/a/39728229/4282127

从版本 57 开始,Chrome 应该支持重定向 (3xx) 处的预检请求。因此,更新到最新的 Chrome 版本应该至少可以解决预检请求丢失的问题。

  • 我更新了我的浏览器……Chrome 57 确实根据最新的 CORS 规范处理了重定向的预检请求。 (2认同)