移动端 OPTIONS 请求为何返回 405 Method Not Allowed
移动端发起跨域请求时,浏览器会自动发送 OPTIONS 预检请求,若服务器未正确配置该方法,将导致请求失败。
检查服务器是否支持 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 头部缺失或不正确,说明跨域配置有问题。通过抓包工具,可以更直观地定位问题所在,并指导服务器端的配置修改。
资料与延伸阅读
你可以通过以下原始资料核对文中概念,并继续深入阅读。