title: "HTTP Location" date: 2020-09-29T17:33:00+08:00 tags: ["编程"] draft: false
最近在开发 CashWarden,后端使用自己最熟悉的 Yii2 框架开发的。
Yii2 默认支持 RESTful 风格,有几个接口我可以直接使用默认的就可以了,非常省力。 CashWarden 使用前后端分离的方式开发的,在这过程中,我遇到了一个非常奇怪的问题,花了一点时间(差不多一天时间吧)才解决,今天这篇文章我打算分享一下我遇到的问题,以及我是怎么解决的,希望看完你也有收获。
<!--more-->在开发创建标签功能的时候,我使用了 HTTP POST 请求后端 /api/tags
接口,因为这个接口非常的标准化,Yii2 默认的 RESTFul 就够用了。
在线上环境发现每次创建标签,要请求三个接口,而且开发者工具的 Console 都会有一个报错信息,会影响功能使用。本地也是三个请求,但是没有报错信息。
后面两个是一组请求,这个我知道,但问题是我确定我创建完标签没有请求详情接口,我一度怀疑是前端框架的锅(因为对源码不熟),是它默认帮我请求的,但是我得找到证据,唯一的疑点在于第一个请求返回的 HTTP 状态码是 302,于是我就去找资料,最后终于被我找到了。
因为 Yii2 默认的 CreateAction
的最后返回在 Header 里面加入了 Location
,它的值就是详情的 URL 地址:
HTTP POST 返回的 Header:
proxy.conf.json
达到效果。但是部署的时候不能用这种方式,只能通过配置 Nginx 代理的方式请求后端接口,这就导致本地没有这个问题,上线才出现。既然找到了问题,不是前端的锅,而是后端的锅那就好解决问题了。我的解决方式就是继承 CreateAction
,然后重写 run
方法。删掉加 Header 的那行代码,改为使用 findOne()
查数据,返回结果。
其实遇到这个问题,主要还是自己 HTTP 协议不熟导致的,只知道 302 的重定向跳转,但是不知道 Header 如果有 Location
浏览器会自动请求的知识。
与此类似的知识点就是前端跨域的 HTTP OPTIONS 请求。