移动体验 / 方法解读

移动端 OPTIONS 请求为何返回 405 Method Not Allowed

移动端发起跨域请求时,浏览器会自动发送 OPTIONS 预检请求,若服务器未正确配置该方法,将导致请求失败。

展示数据库查询语句,包含状态码403和405以及请求方法等字段,用于分析HTTP请求状态。
主题资料配图,非新闻现场照片 · 配图:status:403 or status:405 | select host as host,request_method as

检查服务器是否支持 OPTIONS 方法

移动端浏览器在发起跨域请求前,会自动发送 OPTIONS 请求以探测服务器是否允许跨域访问。如果服务器未配置允许 OPTIONS 方法,或者该方法的处理逻辑返回了 405 状态码,浏览器就会阻止后续的实际请求。这是因为 OPTIONS 请求本身没有请求体,其响应头中的 Allow 字段明确列出了服务器支持的方法。当 Allow 头部中不包含 OPTIONS 时,客户端会判定该资源不支持跨域预检。

排查时需确认服务器端配置是否允许 OPTIONS 方法。对于 Apache 服务器,需检查 .htaccess 文件中是否有类似 RewriteRule 或 <Limit> 的配置限制了 OPTIONS 请求。对于 Nginx 服务器,需检查 server 或 location 块中是否有 deny all 或 limit_except 指令排除了 OPTIONS 方法。确保服务器返回的响应头中包含 Allow: OPTIONS,且状态码为 200 或 204,而不是 405。

验证响应头中的 Allow 字段

在移动端开发者工具的 Network 面板中,找到 OPTIONS 请求的响应头,重点检查 Allow 字段。该字段列出了服务器当前允许的 HTTP 方法。如果 Allow 字段缺失,或者仅包含 GET、POST 等方法而不包含 OPTIONS,说明服务器未正确响应预检请求。根据 HTTP 协议规范,服务器应明确告知客户端哪些方法可用,否则客户端无法确定是否可以发送跨域请求。

除了检查 Allow 字段,还需确认响应状态码是否为 200 OK 或 204 No Content。如果状态码为 405 Method Not Allowed,则直接表明服务器拒绝了 OPTIONS 方法。此时应修改服务器配置,允许 OPTIONS 方法通过。在配置修改后,刷新页面重新发起请求,再次检查 Network 面板中的响应头和状态码,确保它们符合预期。

确认跨域相关响应头配置

即使服务器支持 OPTIONS 方法,如果未正确配置跨域相关的响应头,浏览器仍会阻止请求。在 OPTIONS 请求的响应中,必须包含 Access-Control-Allow-Methods 头部,该头部列出了服务器允许的跨域请求方法。如果该头部缺失或未包含实际请求的方法(如 GET 或 POST),浏览器会认为跨域策略未通过,从而阻止请求。

检查 Access-Control-Allow-Methods 头部时,应确保其值包含 OPTIONS 以及实际业务请求的方法。例如,如果业务请求是 POST,则该头部应至少包含 OPTIONS 和 POST。此外,还需检查 Access-Control-Allow-Origin 头部是否正确设置了允许的源地址。如果这些头部配置不正确,即使服务器支持 OPTIONS 方法,跨域请求依然无法成功。

使用抓包工具确认请求流程

如果移动端开发者工具无法直接查看,可以使用抓包工具(如 Charles 或 Wireshark)捕获网络请求。抓包工具可以显示完整的 HTTP 请求和响应流程,包括 OPTIONS 预检请求和后续的实际请求。通过抓包,可以确认浏览器是否在发起实际请求前发送了 OPTIONS 请求,以及服务器对 OPTIONS 请求的响应内容。

在抓包结果中,找到 OPTIONS 请求的响应内容,检查其状态码、响应头和响应体。如果响应状态码为 405,说明服务器未允许该方法。如果响应状态码为 200,但 Access-Control-Allow-Methods 头部缺失或不正确,说明跨域配置有问题。通过抓包工具,可以更直观地定位问题所在,并指导服务器端的配置修改。

资料与延伸阅读

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

  1. HTTP messages - HTTP | MDN ↗
  2. 配图:status:403 or status:405 | select host as host,request_method as ↗
← 更多移动体验文章返回顶部 ↑