302 响应错误

Posted

技术标签:

【中文标题】302 响应错误【英文标题】:302 Response Error 【发布时间】:2017-06-11 00:17:39 【问题描述】:

我正在向我的本地 Web 服务发出 GET 请求,我期望返回 302 响应,并在标头中包含一个位置。但是,即使我可以在本地看到正在处理请求并且正在创建响应,并且 Web 服务中没有任何错误,我也会收到未定义的响应和网络错误。

我在 Postman 和 Chrome 中尝试过,它会收到重定向响应并进行相应的重定向。

我不确定这是否是 CORS 问题,如果是,我该如何解决?

我已经在 CORS 过滤器的响应头中添加了

Access-Control-Expose-Headers: Location, [own headers]
Access-Control-Allow-Origin: '*'
Access-Control-Allow-Methods: POST, PUT, GET, OPTIONS, DELETE
Access-Control-Max-Age: [some age]
Access-Control-Allow-Headers: [own headers]

当我使用 Postman 时,该位置出现在标题中

我使用 Axios 发出的请求和配置是

const config = 
  url: [someURL],
  method: 'GET',
  headers: 
    'customHeader':'token',
  ,
  params: 
    [params]
  ,
  maxRedirects: 0,
  validateStatus: status => (status >= 200 && status < 300) || status === 302,
;

如果响应在到达我的 JS 代码时未定义,但在 Postman 和 Chrome 中可以正常工作,任何帮助将不胜感激。

我可以解决此问题的一种方法是使用 HTTP 状态代码 200 并获取要重定向的位置标头,但我想避免这种情况,因为它在技术上是重定向响应。

【问题讨论】:

可能您可以尝试检查readyState 状态并寻找HEADERS_RECEIVED (xhr.spec.whatwg.org)。也检查这个***.com/questions/228225/… 答案。 但我得到一个未定义的响应,其中不包括任何状态或响应正文或标题 【参考方案1】:

您的请求triggers your browser to first send a CORS preflight OPTIONS request 中的'customHeader':'token' 部分。 任何您添加到请求的标头(定义为CORS-safelisted request-headers 的标头除外)都会触发浏览器发送 CORS 预检 OPTIONS 请求。

您没有从 Postman 获得此信息的原因是,与浏览器引擎不同,Postman 不实现 CORS,因此它不发送 OPTIONS 请求。 (Postman 不在浏览器为 Web 应用程序强制实施的同源 Web 安全模型下运行。)

如果服务器没有以正确的方式响应 CORS 预检 OPTIONS 请求,您的请求将失败,唯一的解决方法是不要将 'customHeader':'token' 部分添加到您的请求中,或者以其他任何方式构建您的请求触发您的浏览器进行 CORS 预检。

【讨论】:

我有其他可以正常工作的端点(GET、POST、DELETE、PUT 和 OPTION)与 CORS 预检 OPTIONS 请求一起工作,但返回 302 响应的端点除外。我不太清楚您所说的“以触发浏览器执行 CORS 预检的任何方式构建您的请求”是什么意思,这是否意味着我必须将位置标头添加到我的请求中?

以上是关于302 响应错误的主要内容,如果未能解决你的问题,请参考以下文章

Service Worker:如何处理 302 重定向响应

WebSocket 握手期间出错:意外的响应代码:302

HTTP的响应码?

Laravel 路由仅在 phpunit 测试期间返回 302 而不是 404 响应

http的响应码200,404,302,500的含义

常见响应码