Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
如何准确识别网站的真实根路径(非域名根目录场景)_创想鸟

如何准确识别网站的真实根路径(非域名根目录场景)

如何准确识别网站的真实根路径(非域名根目录场景)

本文探讨了在动态部署环境(如文档构建器或ci/cd工具)中,如何准确获取网站的真实根路径,尤其当它并非简单的域名根目录时。针对 `window.location.origin` 不足的场景,我们提出了一种利用 `fetch` api发送 `head` 请求并捕获重定向url的解决方案,从而有效识别出包含子路径的实际网站根目录,并提供了具体的javascript实现及使用注意事项。

理解网站根路径识别的挑战

在Web开发中,我们经常需要将相对URL转换为绝对URL。通常情况下,我们可能倾向于使用 window.location.origin 来作为网站的根路径。例如,对于 https://example.com/docs/page.html,window.location.origin 会返回 https://example.com。然而,在现代的部署实践中,尤其是在使用文档构建器(如Sphinx结合ReadTheDocs)或CI/CD工具时,网站的“功能性”根路径可能并非域名本身,而是包含特定子路径的URL。

例如,一个文档网站可能在 https://pydata-sphinx-theme.readthedocs.io/en/stable/ 处提供服务,而不是直接在 https://pydata-sphinx-theme.readthedocs.io。在开发或测试分支上,URL可能更复杂,如 https://pydata-sphinx-theme–1344.org.readthedocs.build/en/1344/。在这种情况下,如果仅依赖 window.location.origin,我们将无法得到正确的基准路径来构建绝对URL,导致链接错误或重定向失败。

最初的尝试可能如下所示,它将相对URL与 window.location.origin 拼接:

/** * 检查URL是否为相对路径,并根据需要从origin构建绝对路径。 * * @param {string} url 要检查的URL * @returns {string} 绝对URL */function makeAbsoluteUrlWithOrigin(url) {  // 匹配非绝对URL的正则表达式  const pattern = /^(?!(?:[a-z]+:)?//)/i;  const base_url = window.location.origin; // 这里的base_url可能不准确  if (pattern.test(url)) {    // 确保拼接时路径规范化    const normalizedBase = base_url.endsWith('/') ? base_url.slice(0, -1) : base_url;    const normalizedUrl = url.startsWith('/') ? url.slice(1) : url;    return `${normalizedBase}/${normalizedUrl}`;  }  return url;}// 示例:// 当前页面URL: https://pydata-sphinx-theme--1344.org.readthedocs.build/en/1344/examples/index.html// makeAbsoluteUrlWithOrigin("other-page.html") 会返回:// https://pydata-sphinx-theme--1344.org.readthedocs.build/other-page.html// 而期望的结果可能是:// https://pydata-sphinx-theme--1344.org.readthedocs.build/en/1344/other-page.html

显然,这种方法在需要包含子路径作为根目录的场景下是不足的。

解决方案:利用HTTP重定向识别真实根路径

许多部署平台(如ReadTheDocs)有一个共同的特点:当你访问其裸域名或项目根URL(例如 https://pydata-sphinx-theme.readthedocs.io 或 https://pydata-sphinx-theme–1344.org.readthedocs.build)时,它会自动重定向到一个更具体的、包含版本或语言信息的路径(例如 https://pydata-sphinx-theme.readthedocs.io/en/stable/)。这个重定向后的URL正是我们需要的“真实”网站根路径。

我们可以利用 fetch API发送一个 HEAD 请求来捕获这个重定向行为。HEAD 请求只获取资源的头部信息,不会下载整个响应体,因此效率较高。fetch 响应对象中的 url 属性会包含最终的(经过所有重定向后的)URL。

下面是实现这一策略的JavaScript代码:

/** * 异步获取当前网站的真实根路径,考虑了从origin到功能性基准路径的重定向。 * * @returns {Promise} 一个Promise,解析为真实的基准URL。 */async function getTrueWebsiteRoot() {  try {    // 向当前页面的origin发送HEAD请求。    // response.url 将包含经过所有重定向后的最终URL。    const response = await fetch(window.location.origin, { method: "HEAD" });    return response.url;  } catch (error) {    console.error("获取真实网站根路径失败:", error);    // 如果获取失败,回退到window.location.origin,但请注意这可能不是“真实”根路径    return window.location.origin;  }}/** * 检查给定的URL是否为相对路径,如果是,则使用确定的真实网站根路径将其转换为绝对路径。 * * @param {string} url 要检查并可能转换为绝对路径的URL。 * @returns {Promise} 一个Promise,解析为绝对URL。 */async function makeAbsoluteUrl(url) {  // 匹配非绝对URL的正则表达式(不以协议或双斜杠开头)  const isRelativeUrl = /^(?!(?:[a-z]+:)?//)/i;  if (isRelativeUrl.test(url)) {    const base_url = await getTrueWebsiteRoot(); // 等待获取真实的基准URL    // 规范化base_url和传入的url,确保拼接正确    const normalizedBase = base_url.endsWith('/') ? base_url.slice(0, -1) : base_url;    const normalizedUrl = url.startsWith('/') ? url.slice(1) : url;    return `${normalizedBase}/${normalizedUrl}`;  }  return url; // 已经是绝对URL}

代码解析与注意事项

getTrueWebsiteRoot() 函数:

这是一个 async 函数,因为它内部使用了 await 来等待 fetch 请求的完成。fetch(window.location.origin, { method: “HEAD” }):向当前页面的原始域名(例如 https://pydata-sphinx-theme–1344.org.readthedocs.build)发起一个 HEAD 请求。HEAD 请求是获取资源头部信息最有效的方式,它不会下载资源的主体内容,从而节省带宽和时间。response.url:这是 fetch 响应对象的一个关键属性。它返回的是最终的URL,即在经过所有HTTP重定向之后浏览器实际访问的URL。这正是我们寻找的“真实”网站根路径。try…catch 块:用于捕获网络错误或 fetch 请求失败的情况,并提供一个回退机制(虽然回退到 window.location.origin 可能不总是理想的,但在无法获取真实根路径时,这是一个合理的默认值)。

makeAbsoluteUrl() 函数:

同样是一个 async 函数,因为它需要 await getTrueWebsiteRoot() 的结果。isRelativeUrl 正则表达式:用于判断传入的 url 是否为相对路径。它检查URL是否不以协议(如 http:、https:)或双斜杠(//)开头。await getTrueWebsiteRoot():在这里我们调用并等待 getTrueWebsiteRoot 函数返回真实的基准URL。URL规范化:normalizedBase 和 normalizedUrl 确保在拼接URL时,不会出现双斜杠(//)或缺少斜杠的情况,例如 https://base.com//path 或 https://base.compath。如果 url 已经是绝对路径,则直接返回。

异步操作:

由于 fetch 是一个异步操作,getTrueWebsiteRoot 和 makeAbsoluteUrl 都返回 Promise。这意味着在调用 makeAbsoluteUrl 时,你需要使用 await 或 .then() 来处理其结果。

// 示例用法:async function exampleUsage() {  const relativePath = "examples/index.html";  const absolutePath = await makeAbsoluteUrl(relativePath);  console.log(`原始相对路径: ${relativePath}`);  console.log(`转换后的绝对路径: ${absolutePath}`);  // 假设当前页面是 https://pydata-sphinx-theme--1344.org.readthedocs.build/en/1344/any-page.html  // 期望输出: https://pydata-sphinx-theme--1344.org.readthedocs.build/en/1344/examples/index.html}exampleUsage();

总结

通过利用 fetch API的 HEAD 请求和其响应的 url 属性,我们可以有效地解决在动态部署环境中识别网站真实根路径的挑战。这种方法特别适用于那些通过HTTP重定向来指引用户到其功能性根目录的平台。虽然此方案在处理特定类型的部署环境(如ReadTheDocs)时表现出色,但在更通用的场景下,仍需根据具体网站的结构和服务器配置进行调整。在实际应用中,还应考虑网络请求的开销,并可能为频繁调用的场景添加缓存机制。

以上就是如何准确识别网站的真实根路径(非域名根目录场景)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1534384.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
深入理解JavaScript代码的压缩、混淆与Source Map应用
上一篇 2025年12月21日 01:34:23
Node.js Express应用中高效利用内存缓存与定时数据更新策略
下一篇 2025年12月21日 01:34:33

相关推荐

  • 苹果iPhone Air的机身会弯折吗?极端测试揭晓答案

    苹果iPhone Air的机身会弯折吗?极端测试揭晓答案苹果iPhone Air的机身会弯折吗?极端测试揭晓答案苹果iPhone Air的机身会弯折吗?极端测试揭晓答案苹果iPhone Air的机身会弯折吗?极端测试揭晓答案

    9月10日,苹果发布了全新iphone air,其最薄处仅为5.6毫米,一举打破纪录,成为史上厚度最小的iphone机型,超越此前保持记录的6.9毫米厚的iphone 6。 回顾过去,当年iPhone 6因过薄的铝合金机身在压力下出现“弯曲门”事件,引发了广泛讨论。尽管已是多年前的事,但这一阴影仍影…

    2026年10月2日 • 用户投稿
    000
  • DeepSeek Chat如何导出聊天记录 数据备份方法分享

    DeepSeek Chat如何导出聊天记录 数据备份方法分享DeepSeek Chat如何导出聊天记录 数据备份方法分享DeepSeek Chat如何导出聊天记录 数据备份方法分享DeepSeek Chat如何导出聊天记录 数据备份方法分享

    当您希望保存与DeepSeek Chat的对话内容以供后续查阅或作为资料备份时,可能会寻找导出聊天记录的方法。本文将为您详细介绍几种实用且易于操作的数据备份方法,通过分步讲解手动复制粘贴、利用浏览器打印功能以及借助扩展程序这三种方式,帮助您轻松地将重要的聊天记录完整地保存到本地。 ☞☞☞AI 智能聊…

    2026年10月2日 • 用户投稿
    000
  • windows怎么删除不需要的输入法 windows多余输入法删除教程

    windows怎么删除不需要的输入法 windows多余输入法删除教程windows怎么删除不需要的输入法 windows多余输入法删除教程windows怎么删除不需要的输入法 windows多余输入法删除教程windows怎么删除不需要的输入法 windows多余输入法删除教程

    首先通过系统设置删除多余输入法,进入语言选项后在键盘部分点击删除;其次可用控制面板的高级设置调整默认输入法并移除不需要的键盘布局;最后可通过PowerShell命令获取语言列表,筛选保留所需输入法(如zh-CN)并强制应用更改,实现批量清理。 如果您在使用Windows系统时发现输入法列表中存在多个…

    2026年10月2日 • 用户投稿
    200
  • TP-Link台式机蓝屏WiFi问题怎么办?实用指南教你恢复系统稳定。

    TP-Link台式机蓝屏WiFi问题怎么办?实用指南教你恢复系统稳定。TP-Link台式机蓝屏WiFi问题怎么办?实用指南教你恢复系统稳定。TP-Link台式机蓝屏WiFi问题怎么办?实用指南教你恢复系统稳定。TP-Link台式机蓝屏WiFi问题怎么办?实用指南教你恢复系统稳定。

    蓝屏由驱动冲突、配置错误或硬件问题引起,先更新或重装TP-Link无线网卡驱动,再尝试最后一次正确配置启动,进入安全模式排查软硬件问题,执行系统还原恢复系统状态,最后检查网卡与内存的物理连接稳定性。 如果您在使用TP-Link台式机时,连接WiFi后频繁出现蓝屏现象,则可能是由于驱动程序冲突、系统配…

    2026年10月2日 • 用户投稿
    300
  • 什么是观察者模式?观察者的实现

    什么是观察者模式?观察者的实现什么是观察者模式?观察者的实现什么是观察者模式?观察者的实现什么是观察者模式?观察者的实现

    观察者模式是一种一对多的依赖关系,当主题状态改变时,所有观察者自动收到通知并更新。它通过抽象接口实现主题与观察者的解耦,提升系统可扩展性与维护性,广泛应用于事件驱动系统如GUI、MVC、消息队列等。实现时需注意通知风暴、内存泄漏和调试复杂性等陷阱。 观察者模式,在我看来,它本质上是一种“一对多”的对…

    2026年10月2日 • 用户投稿
    1000
  • Java常用API之String类深度解析_Java操作字符串的技巧与方法

    Java常用API之String类深度解析_Java操作字符串的技巧与方法Java常用API之String类深度解析_Java操作字符串的技巧与方法Java常用API之String类深度解析_Java操作字符串的技巧与方法Java常用API之String类深度解析_Java操作字符串的技巧与方法

    java的string类不可变,这确保了线程安全、哈希值可缓存和字符串常量池的可靠性;1. 不可变性避免多线程下共享字符串被意外修改,保障安全性;2. 哈希值在首次计算后可缓存,提升hashmap等集合的性能;3. 字符串常量池通过不可变性实现内存共享,减少重复对象创建;4. 使用+拼接字符串在循环…

    2026年10月2日 • 用户投稿
    100
  • windows怎么设置电源高性能模式_windows开启电源高性能模式步骤

    windows怎么设置电源高性能模式_windows开启电源高性能模式步骤windows怎么设置电源高性能模式_windows开启电源高性能模式步骤windows怎么设置电源高性能模式_windows开启电源高性能模式步骤windows怎么设置电源高性能模式_windows开启电源高性能模式步骤

    首先选择高性能电源模式以提升电脑性能,可通过控制面板、设置应用、命令提示符或创建自定义计划实现;具体步骤包括在控制面板中选择“高性能”计划、在设置中启用“最佳性能”模式、使用命令提示符输入powercfg指令切换,或基于高性能模板创建自定义方案。 如果您希望提升Windows电脑的运行速度和响应能力…

    2026年10月2日 • 用户投稿
    1500
  • Gemini能否处理Excel表格 数据处理功能实测

    Gemini能否处理Excel表格 数据处理功能实测Gemini能否处理Excel表格 数据处理功能实测Gemini能否处理Excel表格 数据处理功能实测Gemini能否处理Excel表格 数据处理功能实测

    本文将围绕Gemini模型在处理Excel表格数据方面的能力进行实际测试。通过具体的操作流程演示,本文将向您展示如何上传Excel文件,并借助精确的指令让Gemini完成数据清洗、整理、分析及洞察提取等一系列任务,让您清晰地了解其作为数据处理工具的潜力和使用方法。 ☞☞☞AI 智能聊天, 问答助手,…

    2026年10月2日 • 用户投稿
    1100
  • Java集合进阶之Map与Set应用_Java高效管理数据的集合框架

    Java集合进阶之Map与Set应用_Java高效管理数据的集合框架Java集合进阶之Map与Set应用_Java高效管理数据的集合框架Java集合进阶之Map与Set应用_Java高效管理数据的集合框架Java集合进阶之Map与Set应用_Java高效管理数据的集合框架

    map和set解决了java中高效查找、去重和键值关联的痛点:1. map通过键值对实现快速查找、配置管理、缓存和数据统计,避免list遍历的低效;2. set通过唯一性实现自动去重、高效成员检查和集合运算;3. 应根据顺序、排序和线程安全需求选择hashmap、linkedhashmap、tree…

    2026年10月2日 • 用户投稿
    100
  • 滴答清单日历视图使用方法详解_滴答清单日历视图切换与日程展示步骤

    滴答清单日历视图使用方法详解_滴答清单日历视图切换与日程展示步骤滴答清单日历视图使用方法详解_滴答清单日历视图切换与日程展示步骤滴答清单日历视图使用方法详解_滴答清单日历视图切换与日程展示步骤滴答清单日历视图使用方法详解_滴答清单日历视图切换与日程展示步骤

    滴答清单日历视图可整合任务与日程,支持按天、周、月查看。首先切换至日历标签,绑定系统日历同步外部事件。任务可添加截止日期或提醒时间,按设定显示在对应日期,支持拖动切换视图。通过设置可自定义显示模式、颜色分类及隐藏已完成任务,提升管理效率。(149字符) 如果您希望更直观地查看和管理每日任务与日程安排…

    2026年10月2日 • 用户投稿
    100
  • PHP文件上传系统:如何通过外键将文件精确关联到特定用户

    本教程详细阐述如何在PHP文件上传系统中,通过引入数据库外键(user_id)将上传的QR码图片与特定用户关联。内容涵盖数据库表结构设计、前端表单改造、后端文件处理逻辑及用户专属内容展示,确保文件上传的精确归属和管理。 1. 理解核心问题与解决方案 在多用户或多角色(如员工为用户上传)的应用场景中,…

    2026年10月2日
    100
  • JS如何实现语音转文字

    JS如何实现语音转文字JS如何实现语音转文字JS如何实现语音转文字JS如何实现语音转文字

    答案:JavaScript语音转文字首选浏览器Web Speech API,适用于Chrome环境下的简单场景;若需高准确率、多语言支持及高级功能,则应采用前端录音、后端调用云服务(如Google、Azure)的方案。 在JavaScript中实现语音转文字,最直接的方式是利用浏览器内置的Web S…

    2026年10月2日 • 用户投稿
    800
  • java使用教程怎样进行java程序的性能调优 java使用教程的性能优化实用技巧​

    java使用教程怎样进行java程序的性能调优 java使用教程的性能优化实用技巧​java使用教程怎样进行java程序的性能调优 java使用教程的性能优化实用技巧​java使用教程怎样进行java程序的性能调优 java使用教程的性能优化实用技巧​java使用教程怎样进行java程序的性能调优 java使用教程的性能优化实用技巧​

    java性能瓶颈常见于cpu密集型操作、内存与gc问题、i/o阻塞及数据库慢查询;2. 提升性能需从jvm调优(如选择g1/zgc、合理设置堆大小)、代码优化(高效算法、减少对象创建、并发工具使用)、外部依赖优化(数据库索引、缓存、消息队列)入手;3. 避免内存泄漏需注意静态集合管理、监听器注销、t…

    2026年10月2日 • 用户投稿
    200
  • CodeRabbit 发布面向终端的 AI 代码审查 CLI 工具

    CodeRabbit 发布面向终端的 AI 代码审查 CLI 工具CodeRabbit 发布面向终端的 AI 代码审查 CLI 工具CodeRabbit 发布面向终端的 AI 代码审查 CLI 工具CodeRabbit 发布面向终端的 AI 代码审查 CLI 工具

    ai代码审查初创公司coderabbit近日发布了“coderabbit cli”——一款专为终端环境设计的智能代码审查工具,可与claude code、codex cli、cursor cli、gemini等主流ai编程助手实现无缝对接。 据CodeRabbit介绍,随着越来越多开发者依赖CLI端…

    2026年10月2日 • 用户投稿
    100
  • 淘宝账号登录异常如何处理

    淘宝账号登录异常如何处理淘宝账号登录异常如何处理淘宝账号登录异常如何处理淘宝账号登录异常如何处理

    登录异常多因密码错误或安全机制触发,先核对账号密码并更新官方App;遇风险提示需完成验证或联系客服;清理设备网络环境后重启登录;成功后立即修改密码并开启双重验证,提升安全性。 淘宝账号登录异常时,多数情况是由于密码错误、设备或网络环境变动、账号安全风险触发系统保护机制导致的。遇到此类问题不必慌张,按…

    2026年10月2日 • 用户投稿
    100
  • 火狐浏览器怎么查看网页源代码_火狐浏览器打开页面源代码与元素检查器方法

    火狐浏览器怎么查看网页源代码_火狐浏览器打开页面源代码与元素检查器方法火狐浏览器怎么查看网页源代码_火狐浏览器打开页面源代码与元素检查器方法火狐浏览器怎么查看网页源代码_火狐浏览器打开页面源代码与元素检查器方法火狐浏览器怎么查看网页源代码_火狐浏览器打开页面源代码与元素检查器方法

    1、通过右键“查看页面源代码”或按Ctrl+U可查看网页HTML;2、右键“检查”或按F12打开开发者工具,可定位并修改具体元素;3、使用F12快捷键启动工具后,点击选择图标可快速检视页面组件。 如果您在浏览网页时需要查看页面的底层结构或调试内容,可以通过火狐浏览器快速访问网页源代码或检查具体元素。…

    2026年10月2日 • 用户投稿
    100
  • win11怎么关闭自动更新_彻底关闭系统更新方法汇总

    win11怎么关闭自动更新_彻底关闭系统更新方法汇总win11怎么关闭自动更新_彻底关闭系统更新方法汇总win11怎么关闭自动更新_彻底关闭系统更新方法汇总win11怎么关闭自动更新_彻底关闭系统更新方法汇总

    可通过设置暂停、禁用服务、组策略、注册表或任务计划程序阻止Windows 11自动更新。一、设置中暂停更新最长35天;二、服务管理器禁用Windows Update服务并设失败无操作;三、组策略编辑器禁用自动更新并删除更新功能访问权限;四、注册表创建WindowsUpdate和AU项,新建NoAut…

    2026年10月2日 • 用户投稿
    100
  • Sublime怎么新建文件?新建文件的4种快捷操作方式

    Sublime怎么新建文件?新建文件的4种快捷操作方式Sublime怎么新建文件?新建文件的4种快捷操作方式Sublime怎么新建文件?新建文件的4种快捷操作方式Sublime怎么新建文件?新建文件的4种快捷操作方式

    在sublime text中新建文件有四种主要方法,适合不同使用场景。① 使用快捷键 ctrl + n(windows/linux)或 cmd + n(mac)可快速在当前窗口打开未命名新文件,适合临时编写内容;② 通过菜单栏点击 “file → new file” 实现相同功能,适合新手熟悉界面;…

    2026年10月2日 • 用户投稿
    100
  • Excel怎么合并多个单元格并保留所有内容_Excel合并单元格内容保留技巧

    Excel怎么合并多个单元格并保留所有内容_Excel合并单元格内容保留技巧Excel怎么合并多个单元格并保留所有内容_Excel合并单元格内容保留技巧Excel怎么合并多个单元格并保留所有内容_Excel合并单元格内容保留技巧Excel怎么合并多个单元格并保留所有内容_Excel合并单元格内容保留技巧

    使用公式或Power Query可合并单元格并保留所有内容。①用“&”连接:=A1&”、”&B1;②CONCATENATE函数:=CONCATENATE(A1,”-“,B1);③TEXTJOIN函数:=TEXTJOIN(&#82…

    2026年10月2日 • 用户投稿
    200
  • 惠普ProBook风扇转速不稳?调整与优化技巧

    惠普ProBook风扇转速不稳?调整与优化技巧惠普ProBook风扇转速不稳?调整与优化技巧惠普ProBook风扇转速不稳?调整与优化技巧惠普ProBook风扇转速不稳?调整与优化技巧

    惠普ProBook风扇异常可通过五种方法优化:1. 使用HP CoolSense自动调节温控;2. 在BIOS中设置自订风扇控制选项,调整数值至3或4以增强散热;3. 优化电源管理,降低最大处理器状态至80%-90%;4. 通过任务管理器清理高CPU占用的后台进程;5. 物理清洁散热口灰尘,确保通风…

    2026年10月2日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信