前端请求接口浏览器发起option预请求而导致405的问题

记一次前端请求后端接口出现405的问题:


问题描述

首先阐述http的405状态码,405的直接提示是method not allowed,即前端请求的方法不被后端接受。(如下图)

当时就纳闷了,我后端路由明明写的post方法,前端也是通过post的方法发起的请求,为什么会提示这个method不被允许。

后来仔细一看发现这个请求的request meshod,天啦撸,居然是option!!!

那么这个option是什么玩意,为什么会产生。


产生原因

Http1.1共定义了9种请求方法,option就是其中的一种

GET请求指定的页面信息,并返回实体主体。
HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
PUT从客户端向服务器传送的数据取代指定的文档的内容。
DELETE请求服务器删除指定的页面。
CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS允许客户端查看服务器的性能。
TRACE回显服务器收到的请求,主要用于测试或诊断。
PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。

option请求其实是一种浏览器自主发起的行为, 在满足以下情况的时候,在普通的get或post请求前,浏览器会自发的先发起一个option请求,检查服务端是否支持相关的方法或自定义信息,如果满足才会发起下一步的请求;

1、接口请求跨域,否则不会发起option请求;

2、有自定义的请求头信息或者请求头中的content-type是application/x-www-form-urlencoded,multipart/form-data,text/plain之外的格式。


我当时就是在做接口校验的时候让前端在head中添加了一个签名秘钥signature的自定义头信息,然后就出现了405的问题。

解决办法

1、在服务端的路由请求部分新增option请求,允许option请求通过。

     我这后端用的php的lumen,路由写法变化(当然也可修改路由类):


 //原来写法
 $app->post('/login','AdminController@login');
 //新增option请求
 $app->addRoute(['OPTIONS','POST'],'/login','AdminController@login');
        

2、对于所有的option请求,可以在cors中间件中对option请求统一返回200即可:

if ($request->getMethod() == "OPTIONS") {
    return response()->json('ok', 200, [
      //自定义内容
    ]);
}

 

### 解决Axios发送POST请求时被预检OPTIONS请求替代的问题 当遇到跨域资源共享(CORS)问题,特别是`Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin'`错误时,这通常意味着服务器未正确配置CORS响应头[^1]。 对于复杂的跨域请求浏览器会在实际请求之前自动发出一个HTTP OPTIONS类型的预检请求来确认服务器是否会接受正式的请求。如果这个预检失败,则真正的请求不会被执行。复杂跨域请求的特点在于它要么使用了除GET/HEAD/POST之外的方法,或者即使使用POST也带有特定的内容类型(比如JSON),亦或是包含了自定义头部信息[^2]。 针对Vue项目中的axios库发起的POST请求变为OPTIONS的情况,可以采取如下措施: #### 后端设置 确保后端已经适当设置了CORS策略,允许来自前端域名的访问,并且明确指定了哪些HTTP动词以及Header是可以接受的。例如,在Express.js框架下可以通过cors中间件实现这一点: ```javascript const cors = require('cors'); app.use(cors({ origin: ['http://example.com'], // 替换成你的前端地址 methods: ['GET', 'POST'], allowedHeaders: ['Content-Type', 'Authorization'] })); ``` #### 前端调整 在某些情况下,也可以尝试修改客户端代码减少不必要的预检请求发生几率。具体来说就是保持POST请求的数据格式为简单请求所支持的形式之一(application/x-www-form-urlencoded, multipart/form-data, text/plain),并避免添加额外的非标准headers除非绝对必要[^3]。 另外一种解决方案是在开发环境中临时绕过同源政策限制,但这仅适用于测试阶段而非生产环境部署方案的一部分。 通过上述手段应该能够有效缓解由于CORS Preflight引起的OPTIONS代替POST的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值