移动体验 / 方法解读

移动端跨域请求预检失败?检查 Access-Control-Allow-Headers 头部配置

移动端发起跨域请求时若遇到预检失败,通常是因为自定义请求头未被服务器允许,需在响应头中添加 Access-Control-Allow-Headers。

手机屏幕上显示的跨域请求预检失败警告弹窗
主题资料配图,非新闻现场照片 · 配图:手机报警警告文件图标或警告信息智能手机通知与危险警

确认错误原因与预检机制

移动端浏览器在发送跨域请求时,若使用了自定义请求头,会先发送一个 OPTIONS 预检请求。服务器必须在响应中包含 Access-Control-Allow-Headers 头部,明确列出浏览器允许发送的请求头名称。如果请求头名称未包含在该列表中,浏览器会拦截后续的实际请求。

错误信息通常提示缺少特定的令牌,这表明服务器未在响应中声明支持该请求头。Access-Control-Allow-Headers 的值是一个逗号分隔的列表,例如 X-Custom-Information。标准但非基础的请求头(如 Content-Type)通常总是被允许,但自定义头必须显式声明。

排查服务器配置与响应头设置

检查服务器配置文件,确保在处理 OPTIONS 请求的响应中添加了 Access-Control-Allow-Headers 头部。该头部应列出所有在跨域请求中使用的自定义请求头名称。如果服务器使用反向代理,需确保代理配置正确传递了该响应头。

验证响应头是否正确发送。可以通过浏览器开发者工具的 Network 面板查看 OPTIONS 请求的响应内容。如果响应头缺失或列表中未包含所需的请求头,需要修改服务器配置以允许该头部,或者移除前端代码中使用该请求头的部分。

修改配置以允许请求头

根据排查结果修改服务器配置。如果服务器支持动态设置响应头,可以在代码中根据请求头名称动态生成 Access-Control-Allow-Headers 的值。如果无法修改服务器,且服务器不在控制范围内,则需在前端避免使用该请求头,或寻找替代方案。

修改配置后,重新发起跨域请求并观察 Network 面板。确保 OPTIONS 请求的响应中包含正确的 Access-Control-Allow-Headers 头部,且列表中包含所有自定义请求头。随后,检查实际请求的响应状态,确认跨域请求成功完成。

验证结果与后续检查

验证结果的方法是检查浏览器控制台是否还有 CORS 相关的错误提示,以及 Network 面板中实际请求的状态码是否为 200。如果预检请求成功且后续请求正常,说明问题已解决。如果仍有错误,需进一步检查其他 CORS 相关响应头,如 Access-Control-Allow-Origin。

确认配置生效后,建议进行回归测试,确保修改不影响其他跨域请求的正常执行。同时,检查服务器日志,确认 OPTIONS 请求是否被正确处理,以及响应头是否被正确记录,以防止未来出现类似配置遗漏的问题。通过这些步骤,可以彻底解决因请求头未声明导致的跨域预检失败问题。

资料与延伸阅读

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

  1. Reason: missing token 'xyz' in CORS header 'Access-Control-Allow-Headers' from CORS preflight channel - HTTP | MDN ↗
  2. 配图:手机报警警告文件图标或警告信息智能手机通知与危险警 ↗
← 更多移动体验文章返回顶部 ↑