当前位置: 首页 > Web前端 > vue.js

浏览器解析相对路径和绝对路径

时间:2023-04-01 01:42:27 vue.js

并记录成长:不以小步而行万里路,不积小流不成江海!前几天因为粗心,在写请求的相对路径的时候,开头少了一个/,导致请求路径没有得到对应的期望值。我决定研究到底是怎么回事!根据以上代码,浏览器中实际请求如下:在ajax中设置一个相对URL/jmtyjmall/api/1.0/activityTask/queryType,浏览器实际请求路由为http://127.0.0.1:5500/jmtyjmall/api/1.0/activityTask/queryType,这个请求就是我想要的!但是由于当时短路,在写url的时候,开头少了一个/,写成了jmtyjmall/api/1.0/activityTask/queryType,然后在浏览器中发送的请求就变成了http://127.0.0.1:5500/axios/html/jmtyjmall/api/1.0/activityTask/queryType比之前的请求多了/axios/html。上面的演示只是一个例子。其实在vue项目中就是用axios来发送请求的。配置url错误,然后出现这个问题。当时虽然觉得这应该类似于页面中使用href和src属性加载相对路径或者绝对路径的特性。但是还是想知道axios会不会做一些特殊的处理,所以看了下axios源码中path的处理,项目中并没有配置baseURL(当时看不懂,请求是相对路径,为什么不配置baseURL?能正常访问吗?)。//axios源码varfullPath=buildFullPath(config.baseURL,config.url);//获取基本请求路径(无参数)functionbuildFullPath(baseURL,requestedURL){if(baseURL&&!isAbsoluteURL(requestedURL)){returncombineURLs(baseURL,requestedURL);}returnrequestedURL;};//是否为绝对路径functionisAbsoluteURL(url){//如果URL以“://”或“//”(协议相对URL)开头,则该URL被视为绝对路径。//RFC3986将方案名称定义为以字母开头并后跟//字母、数字、加号、句点或连字符的任意组合的字符序列。return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);};//返回基本路径或拼接路径函数combineURLs(baseURL,relativeURL){返回relativeURL?baseURL.replace(/\/+$/,'')+'/'+relativeURL.replace(/^\/+/,''):baseURL;};在上面的代码中,可以看出axios去掉了对传入的config.url是否为绝对路径,是否需要拼写baseURL的校验,没有做任何特殊处理(不包括请求参数序列化的处理)。也就是说,请求和用href、src加载资源的行为基本一致。解析路径在网上看了一些资料,加深了对浏览器解析相对路径和绝对路径的理解!绝对路径浏览器在解析绝对路径和相对路径时不会做任何处理:设置的url为https://test2.juxinbox.com/jmtyjmall/api/1.0/activityTask/queryType,实际发送的也是https://test2.juxinbox.com/jmtyjmall/api/1.0/activityTask/queryType绝对路径缺少协议名。当浏览器直接输入url时,协议名http会自动补全!如果在页面上发送请求,会被解析为相对路径!协议名称从url中删除,但实际请求被视为相对路径。相对路径前面有/。如果相对路径前面有/,则在实际请求时会自动加上当前请求页面的协议名、域名、端口。当前请求的页面是http://127.0.0.1:5500/axios/html/test.html,所以实际请求变成了http://127.0.0.1:5500/jmtyjmall/api/1.0/activityTask/queryType。在实际开发中,使用axios发送请求时,配置的url为/jmtyjmall/api/1.0/activityTask/queryType,将项目打包放在与后台代码相同的服务器上。我们请求的时候,浏览器会自动加上协议名、域名、端口,和后台的协议名、域名、端口一致,就可以正常访问了,所以axios的baseURL是这样的没有配置,访问没有报错!但是个人认为在实际开发中还是配置baseURL比较稳妥!相对路径前面没有/。此时url前面没有/,实际请求变成了http://127.0.0.1:5500/axios/html/jmtyjmall/api/1.0/activityTask/queryType。这是因为浏览器解析,根据当前请求页面的url,得到?前面部分最后一个/之前的路径。或者#(去掉后面的参数),用/拼接在一起。因为当前页面的url是http://127.0.0.1:5500/axios/html/test.html,所以实际请求变成了http://127.0.0.1:5500/axios/html/jmtyjmall/api/有1.0/activityTask/queryType页面中的基本标记。在元素中设置。根据MDN,元素是为文档中包含的内容指定的所有相对URL的根URL。副本中只能有一个元素。文档的基本URL,可以通过JS脚本使用document.baseURI查询。如果文档不包含元素,则baseURI默认为document.location.href。所以实际发送的请求是https://test2.juxinbox.com/jmtyjmall/api/1.0/activityTask/queryType!