场景复现
公司日常环境域名协议是http,某次代码本地coding联调接口时,请求路径中顺手写上了请求协议http。日常环境测试完成后,测试同学在pre环境(域名协议https)刷新页面,发现接口挂了。经排查,发现是请求协议不同带来的坑,所以特此记录;
后端接口响应路径
(https|http)://a.test.com/api/test/aaa
代码中写死的接口路径
http://a.test.com/api/test/aaa
浏览器控制台报错
报错分析
搜索引擎中搜索得知 https协议的域名下不能发起http请求,反之http协议的域名下可以发起https请求;简单来说,可以升级,但不可以降级。
解决方案
方案一:使用meta标签强制升级协议(不推荐)
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
不推荐原因
影响面较广,全站请求都会升级成https,可能会有回归不充分导致的接口问题
方案二:代码中请求路径默认情况下不写协议(推荐)
// api.js
const domain = isDaily() ? '//daily-a.test.com' : '//pre-a.test.com';
const urlMap = { test: `${domain}/api/test/aaa` }
export default urlMap
划重点
请求路径不要写协议,从双斜杠开始,这样在接口请求时候默认带上当前域名的协议;
例如:代码中写法是//a.test.com/api/test/aaa
http域名下请求路径是http://a.test.com/api/test/aaa
https域名下请求路径是https://a.test.com/api/test/aaa