https与http混用导致post请求变成OPTIONS请求的案例

2022-08-12 11:46 栏目:技术开发 查看(9615)

某站点反馈极少数情况下某正常接口返回的结果为空,而正常情况下这个接口返回的结果不可能为空。

x1 问题分析

通过打开日志记录分析日志,发现服务端请求日志中出现了异常的OPTIONS请求,而正常情况下应该是post请求。如下图所示:

微信截图_20220812110039

从上述日志记录可知,在请求的header中还包含了origin字段,正常非跨域的请求是不会出现这个字段的。但是这个网站并没有做前后端分离,理论上在站内访问不会存在跨域请求。再次根据上述日志细看,发现referer等信息都是http请求的页面,也就是这个请求是在http页面发起了。

然而这个网站默认访问方式是https,只是没做强制必须用https访问,也就是http也可以访问。估计是极个别网站手动输入页面地址使用的是http路径访问。请求例子如下:

ajax('post','http://test.csweigou.com/api/test/index',{data},0,function (d) {
   console.log(d);
});

在http页面发送上述请求后,发现控制台网络监听界面出现了3次记录,如图所示:

微信截图_20220812112635

上述三个记录分别是:①、307重定向;②、跨站请求被禁止;③、触发预检。而在后台服务端日志中看到的OPTIONS请求其实就是第三条记录产生的。如图所示:

微信截图_20220812112922

x2 问题解决

在后台服务端获取前台发送的请求数据的时候,我们一般是不会使用OPTIONS来接受数据,于是就导致了最开始提到的接口数据为空的异常结果。要避免解决这样的问题可以强制使用https,全站强制启用https访问,即便用户手工输入http链接也会重定向到https,这样就不会产生跨站请求。

x3 相关知识链接

关于出现OPTIONS请求,这种请求方式并不是我们预期常见的访问请求,根据查阅相关资料可知有如下几个跟OPTIONS有关系的要点(下面3个要点是网络上其他网友总结的,仅供参考):

1、Http Options Method:OPTIONS请求方法的主要用途有两个:①、获取服务器支持的HTTP请求方法;②、用来检查服务器的性能。

2、CORS:即跨域资源共享,是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源。而这种访问是被同源策略所禁止的。CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。

3、Preflighted Requests:即预检请求,是CORS中一种透明服务器验证机制。预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的。下面的2种情况需要进行预检: ①、简单请求,比如使用Content-Type 为 application/xml 或 text/xml 的 POST 请求; ②、置自定义头,比如 XJSON等。

与我们的项目经理联系
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

转载请注明出处:https与http混用导致post请求变成OPTIONS请求的案例 - 微构网络
分享: