http 路径解析规则,相对路径和绝对路径

http 路径解析规则

为什么相对路径会被浏览器自动拼接当前页面路径?

  • 这是 HTTP/HTML 规范 规定的行为,目的是让开发者可以更方便地引用资源,而不必每次都写完整的绝对路径。它的核心逻辑是:相对路径是基于当前页面的 URL 路径解析的

绝对路径

特征

  • http://https:////(协议相对 URL)开头
  • 包含完整的 协议 + 域名 + 路径

示例

javascript 复制代码
"http://bob.com/api/data";
"https://api.bob.com/v1/users";
"//cdn.bob.com/image.jpg"; // 协议相对(自动继承当前页面的协议)

相对路径

特征

  • 不以 http://https://// 开头
  • 可能以 ./../ 或直接写路径(如 images/logo.png

示例

javascript 复制代码
"api/data"; // 相对于当前路径
"./config.json"; // 相对于当前目录
"../utils/helper.js"; // 相对于上一级目录
"/static/logo.png"; // 根相对路径(基于域名根目录)

相对路径的解析规则

  • 浏览器(或 HTTP 客户端)在解析相对路径时,会按照以下规则拼接:
  1. / 开头 → 基于 根路径 (域名根目录)
    • /api/datahttp://当前域名/api/data
  2. ./ 开头 → 基于 当前路径
    • ./datahttp://当前域名/当前路径/data
  3. ../ 开头 → 基于 上一级目录
    • ../datahttp://当前域名/上一级路径/data
  4. 直接写路径(和写./ 效果一样)(无 /./ → 基于 当前路径
    • datahttp://当前域名/当前路径/data

当前页面 URL

bash 复制代码
http://localhost:9001/app-dev/bob-mobile-v4/pages/goods

请求的 URL

javascript 复制代码
url: `decorate/get-bob-list`;

浏览器解析过程

  1. 当前路径是 /app-dev/bob-mobile-v4/pages/goods

  2. 请求的是 decorate/get-bob-list(无 /./ 前缀)

  3. 浏览器自动拼接:

    ts 复制代码
    http://localhost:9001/app-dev/bob-mobile-v4/pages/hall/decorate/get-bob-list
    • 因为 demand-collect 是当前路径,decorate/get-bob-list 被视为它的子路径。

为什么绝对路径不会拼接?

绝对路径已经包含完整的 协议(http://)+ 域名 + 路径,浏览器不会额外拼接当前路径:

javascript 复制代码
url: `http://localhost:9001/eshopdev/api/decorate/get-bob-list`;
  • 浏览器直接使用这个 URL,不会修改它。

为什么 HTTP 规范要这样设计?

  1. 灵活性 :开发者可以写短路径,减少代码冗余。
    • 比如 <img src="images/logo.png"> 会自动补全为完整路径。
  2. 可移植性
    • 如果网站从 http://bob.com 迁移到 http://new.bob.com,相对路径仍然有效,而绝对路径需要修改。
  3. 目录结构映射
    • 服务器上的文件目录结构可以直接映射到 URL 路径,方便管理。

如何避免意外拼接?

方法 示例 解析结果
绝对路径 http://localhost:9001/api/data 直接使用,不拼接
根相对路径 (以 / 开头) /api/data http://当前域名/api/data
配置 baseURL(推荐) axios.defaults.baseURL = 'http://localhost:9001/api' 自动补全

推荐做法

javascript 复制代码
// 1. 配置 baseURL(如 Axios)
axios.defaults.baseURL = "http://localhost:9001/eshopdev/api";

// 2. 使用时只写端点路径
axios.get("/decorate/get-bob-list");
// → http://localhost:9001/eshopdev/api/decorate/get-bob-list

常用window.open参数


1. 基本语法

javascript 复制代码
window.open(url, target, windowFeatures);
  • url:要加载的URL地址(字符串)
  • target:指定打开方式(字符串)
  • windowFeatures(可选):窗口特性(如尺寸、工具栏等)

2. '_parent' 参数的作用

'_parent' 表示 在当前窗口的父级框架(如果有)中打开链接,具体行为取决于页面结构:

场景 '_parent' 的行为
页面无框架 等同于在当前窗口打开(和 '_self' 效果相同)
页面嵌套在 <iframe> 在直接包含当前框架的父级窗口/框架中打开(跳过一层嵌套)
多层嵌套框架 只向上查找一级父框架

3. 对比其他 target

target 值 作用
'_blank' 在新窗口/标签页打开(默认行为)
'_self' 在当前窗口打开(替换当前页面)
'_parent' 在父级框架中打开(如上所述)
'_top' 在最顶层窗口打开(跳出所有框架)
'framename' 在指定名称的 <iframe> 中打开

4. 实际示例

(1) 普通页面(无框架)

html 复制代码
<button onclick="window.open('/quotation/detail', '_parent')">
  在当前窗口打开
</button>

效果:点击后当前窗口会跳转到 example.com(等同 '_self')。

(2) 嵌套框架页面

html 复制代码
<!-- 父页面 -->
<iframe src="child.html"></iframe>

<!-- child.html 子页面 -->
<script>
  window.open('/quotation/detail', '_parent');
</script>

效果:链接会在父页面(而非iframe内)打开。


5. 注意事项

  1. 浏览器拦截

    • 大多数浏览器会拦截非用户触发的 window.open()(如异步调用中)。
    • 解决方案:确保在按钮点击等用户直接操作中调用。
  2. 同源策略

    • 如果父子窗口不同源(协议/域名/端口不同),某些操作可能被限制。
  3. 返回值

    • window.open() 返回新窗口的引用(可用于后续控制):

      javascript 复制代码
      const newWindow = window.open('/quotation/detail', '_parent');
  4. 现代替代方案

    • 优先使用 <a> 标签的 target 属性:

      html 复制代码
      <a href="/quotation/detail" target="_parent">打开链接</a>

总结

  • 相对路径会被拼接,因为 HTTP/HTML 规范规定它基于当前路径解析。
  • 绝对路径不会拼接,因为它已经是完整路径。
  • 最佳实践 :使用 baseURL 或环境变量管理 API 路径,避免硬编码。
类型 特征 示例 解析方式
绝对路径 http://https:// 开头 https://bob.com/api 直接使用
协议相对路径 // 开头 //cdn.bob.com/jquery.js 继承当前页面协议
根相对路径 / 开头 /api/data 基于域名根目录拼接
相对路径 ./../ 或无前缀 ../utils.jsapi/data 基于当前页面路径拼接
相关推荐
max5006001 小时前
基于桥梁三维模型的无人机检测路径规划系统设计与实现
前端·javascript·python·算法·无人机·easyui
我命由我123452 小时前
软件开发 - 避免过多的 if-else 语句(使用策略模式、使用映射表、使用枚举、使用函数式编程)
java·开发语言·javascript·设计模式·java-ee·策略模式·js
萌萌哒草头将军2 小时前
Node.js v24.6.0 新功能速览 🚀🚀🚀
前端·javascript·node.js
AALoveTouch3 小时前
大麦APP抢票揭秘
javascript
持久的棒棒君3 小时前
启动electron桌面项目控制台输出中文时乱码解决
前端·javascript·electron
小小愿望6 小时前
移动端浏览器中设置 100vh 却出现滚动条?
前端·javascript·css
烛阴6 小时前
TypeScript 接口入门:定义代码的契约与形态
前端·javascript·typescript
掘金安东尼7 小时前
使用自定义高亮API增强用户‘/’体验
前端·javascript·github
夏日不想说话8 小时前
API请求乱序?深入解析 JS 竞态问题
前端·javascript·面试
掘金安东尼8 小时前
我们让 JSON.stringify 的速度提升了两倍以上
前端·javascript·面试