移动体验 / 方法解读

移动端网页跨域请求为何报错 CORS preflight 失败?

移动端网页跨域请求报错 CORS preflight 失败时,应重点检查是否存在重复发送预检请求的情况。

检查是否重复发送预检请求

移动端网页发起跨域请求时,如果请求需要预检,浏览器会先发送 OPTIONS 请求。资料指出,如果之前已经执行过一次预检,再次执行是不被允许的。这意味着代码中可能存在逻辑错误,导致在同一个连接上重复触发了预检机制。开发者需要确认代码逻辑,确保预检请求只发送一次。

排查时可以查看网络请求列表,确认是否存在多个 OPTIONS 请求。如果发现重复,应检查前端代码中的请求发送逻辑,避免在连接建立后重复调用触发预检的方法。确保每次跨域请求只对应一次预检过程,是解决该问题的关键步骤。

排查网络请求是否发生错误

预检请求本身也可能因为网络原因而失败。资料提到,预检请求可能遭受任何种类的网络错误。在移动端环境下,网络环境可能不稳定,导致预检请求无法到达服务器或服务器无法正常响应。这种情况下,浏览器会报告预检失败,进而阻止后续的实际请求。

可以通过查看浏览器的开发者工具或网络面板,检查预检请求的状态码和响应内容。如果发现请求失败或超时,需要排查网络连接是否正常,以及服务器端是否正确配置了 OPTIONS 请求的处理逻辑。确保服务器能够正常响应预检请求是解决该问题的前提。

验证服务器是否支持跨域配置

如果预检请求没有发生重复且网络正常,那么问题可能出在服务器的跨域配置上。资料指出,如果服务器不受控制,可以参考客户端的替代方案。这意味着服务器端必须正确设置 CORS 相关的响应头,以允许跨域请求。如果服务器未配置或配置错误,预检请求将无法通过。

检查服务器端的 CORS 配置,确保返回了正确的 Access-Control-Allow-Origin 等响应头。如果服务器配置不符合要求,浏览器将拒绝预检请求。对于无法控制的服务器,前端开发者可能需要寻找其他解决方案,例如使用代理服务器来转发请求。

确认请求方法与头部是否符合要求

预检请求的失败也可能是因为请求的方法或头部不符合 CORS 规范。资料提到,预检请求可能因为任何种类的网络错误而失败,这包括服务器对请求方法的拒绝。如果请求使用了服务器不允许的方法,或者头部信息不符合要求,服务器可能会返回错误,导致预检失败。

检查发起的跨域请求是否使用了 GET、POST 等简单方法,或者是否正确设置了必要的头部信息。如果使用了复杂方法或自定义头部,必须确保服务器端允许这些方法。通过调整请求的方法或头部,可以避免因不符合要求而导致的预检失败。

资料与延伸阅读

你可以通过以下原始资料核对文中概念,并继续深入阅读。

  1. Reason: CORS preflight channel did not succeed - HTTP | MDN ↗
← 更多移动体验文章返回顶部 ↑