新闻中心

如何识别并获取非域名根目录的网站真实根路径

2025-11-01
浏览次数:
返回列表

如何识别并获取非域名根目录的网站真实根路径

本文探讨了在复杂部署环境中(如ReadTheDocs或CI/CD工具)识别网站真实根路径的挑战。由于`window.location.origin`可能无法准确反映带有语言或版本前缀的有效根目录,文章提出并详细阐述了如何利用`fetch` API的重定向跟踪功能,通过发出`HEAD`请求来动态获取网站的实际有效根URL,从而正确构建绝对路径。

理解网站根路径的挑战

在Web开发中,尤其是在构建文档版本切换器或处理重定向逻辑时,准确识别一个网站的“根路径”至关重要。通常,开发者会倾向于使用window.location.origin来获取当前页面的协议、域名和端口,并将其作为网站的根。例如,对于https://example.com/docs/page.html,window.location.origin会返回https://example.com。

然而,在某些特定的部署场景下,如使用ReadTheDocs(RDT)这样的第三方文档构建服务或在CI/CD环境中进行预览部署时,window.location.origin可能无法代表网站的“有效”根目录。例如,一个RDT构建的文档可能其主页是https://pydata-sphinx-theme.readthedocs.io/en/stable/,而非简单的https://pydata-sphinx-theme.readthedocs.io。同样,一个PR预览构建的URL可能是https://pydata-sphinx-theme--1344.org.readthedocs.build/en/1344/,而不是https://pydata-sphinx-theme--1344.org.readthedocs.build。

在这种情况下,如果用户尝试访问一个在旧版本中不存在的页面(例如,从https://pydata-sphinx-theme.readthedocs.io/en/stable/examples/index.html切换到v0.9,而该页面在v0.9中不存在),我们希望将其重定向到该版本的有效根目录,例如https://pydata-sphinx-theme.readthedocs.io/en/v0.9.0/。如果仅依赖window.location.origin,则可能导致重定向到错误的或无效的路径。

初始尝试与局限性

为了将相对URL转换为绝对URL,一种常见的做法是结合window.location.origin:

/**
 * 检查URL是否为绝对路径,如果不是,则从网站根目录生成绝对路径。
 *
 * @param {string} url 要检查的URL。
 * @returns {string} 处理后的绝对URL。
 */
function makeAbsoluteUrl(url) {
  // 正则表达式模式匹配相对URL
  const pattern = /^(?!(?:[a-z]+:)?\/\/)/i;
  const baseUrl = window.location.origin; // 初始尝试使用origin作为基准
  url = pattern.test(url) ? baseUrl + "/" + url : url;

  return url;
}

然而,正如前面所述,当网站的实际根路径包含子目录(如/en/stable/或/en/1344/)时,这种方法就会失效。例如,如果当前页面是https://pydata-sphinx-theme--1344.org.readthedocs.build/en/1344/some/page.html,window.location.origin会返回https://pydata-sphinx-theme--1344.org.readthedocs.build。如果此时我们尝试将相对路径new-version/index.html转换为绝对路径,会得到https://pydata-sphinx-theme--1344.org.readthedocs.build/new-version/index.html,这显然不是我们期望的在en/1344/下的路径。

Mureka Mureka

Mureka是昆仑万维最新推出的一款AI音乐创作工具,输入歌词即可生成完整专属歌曲。

Mureka 1091 查看详情 Mureka

利用 fetch API 跟踪重定向获取真实根路径

经过分析,我们发现许多这类平台(如ReadTheDocs)在访问其裸域名(例如https://pydata-sphinx-theme.readthedocs.io)时,会自动将其重定向到带有默认语言和版本前缀的实际根路径(例如https://pydata-sphinx-theme.readthedocs.io/en/stable/)。这一行为为我们提供了一个识别真实根路径的有效途径。

我们可以利用J*aScript的fetch API,向window.location.origin发起一个HEAD请求。HEAD请求只会获取响应头,而不会下载整个页面内容,这使其效率更高。更重要的是,fetch API在处理重定向时,其返回的Response对象的url属性会包含最终重定向后的URL。

下面是改进后的makeAbsoluteUrl函数实现:

/**
 * 异步函数:解析网站的真实根URL(处理重定向),然后根据需要将输入URL转换为绝对路径。
 *
 * @param {string} url 要检查并可能转换为绝对路径的URL。
 * @returns {Promise<string>} 一个Promise,解析为最终的绝对URL。
 */
async function makeAbsoluteUrl(url) {
  // 正则表达式模式匹配相对URL
  const pattern = /^(?!(?:[a-z]+:)?\/\/)/i;

  let effectiveBaseUrl = window.location.origin; // 默认使用origin作为基准

  try {
    // 尝试向origin发起HEAD请求,以跟踪任何重定向
    // 这对于像ReadTheDocs这样的平台至关重要,它们的"origin"通常会重定向到
    // 更具体的根路径(例如,/en/stable/)。
    const response = await fetch(window.location.origin, {
      method: "HEAD",
      redirect: "follow" // 确保fetch会跟踪所有重定向
    });
    effectiveBaseUrl = response.url; // 获取重定向后的最终URL
  } catch (error) {
    console.warn("无法通过fetch确定有效的基准URL,回退到window.location.origin:", error);
    // 如果fetch失败,effectiveBaseUrl将保持为window.location.origin
  }

  // 如果输入URL是相对路径,则在其前面加上有效的基准URL
  if (pattern.test(url)) {
    // 确保在拼接时不会出现双斜杠,如果effectiveBaseUrl已经以斜杠结尾
    const separator = effectiveBaseUrl.endsWith('/') ? '' : '/';
    return effectiveBaseUrl + separator + url;
  }

  return url; // 如果URL已经是绝对路径,则直接返回
}

// 示例用法:
// 当页面在 https://pydata-sphinx-theme--1344.org.readthedocs.build/en/1344/some/page.html 时
// makeAbsoluteUrl("new-version/index.html").then(absolutePath => {
//   console.log(absolutePath); // 预期输出: https://pydata-sphinx-theme--1344.org.readthedocs.build/en/1344/new-version/index.html
// });

// makeAbsoluteUrl("/en/v0.9.0/").then(absolutePath => {
//   console.log(absolutePath); // 预期输出: https://pydata-sphinx-theme--1344.org.readthedocs.build/en/v0.9.0/
// });

代码解析与注意事项

  1. async 函数与 await: 由于fetch API是异步的,makeAbsoluteUrl函数必须声明为async,并使用await关键字等待fetch操作完成并获取响应。
  2. fetch(window.location.origin, { method: "HEAD", redirect: "follow" }):
    • window.location.origin:作为请求的目标URL,我们期望它能触发重定向。
    • method: "HEAD":指示只获取响应头,这比GET请求更高效,因为它不需要下载整个页面内容。
    • redirect: "follow":这是fetch的默认行为,但明确指定它确保fetch会自动跟踪所有HTTP重定向,直到达到最终的URL。
  3. response.url: 在fetch操作成功并跟踪完所有重定向后,response.url属性将包含最终的、重定向后的URL。这个URL就是我们所寻找的网站的有效根路径。
  4. 错误处理: 使用try...catch块来捕获fetch可能抛出的错误(例如,网络问题或CORS限制)。如果fetch失败,函数会回退到使用window.location.origin作为基准,并输出警告信息。
  5. 路径拼接: 在将相对URL与effectiveBaseUrl拼接时,我们添加了一个简单的逻辑来避免出现双斜杠(例如https://example.com//path),确保路径格式正确。
  6. 异步性处理: 由于makeAbsoluteUrl现在是一个异步函数,调用者需要使用.then()或await来处理其返回的Promise,以获取最终的绝对URL。

总结

通过利用fetch API的重定向跟踪能力,我们可以克服window.location.origin在特定部署环境中(如ReadTheDocs、CI/CD预览)的局限性,准确地识别网站的真实有效根路径。这种方法对于构建需要精确URL解析和重定向逻辑的Web应用(尤其是文档版本切换器)非常有效。然而,需要注意的是,此解决方案主要针对那些通过HTTP重定向将其“裸”域名指向更深层有效根路径的场景。对于没有这种重定向行为的网站,window.location.origin可能仍然是合适的选择,或者需要结合其他逻辑进行判断。

以上就是如何识别并获取非域名根目录的网站真实根路径的详细内容,更多请关注其它相关文章!


# java  # html  # 正则表达式  # 端口  # 工具  # javascript  # 如何识别  # 山西刷关键词排名首页  # 至关重要  # 哪种字体最符合seo  # 小虎谈优化网站  # pc网站建设加推广  # 衢州抖音seo投放  # 福州网站建设方案目录  # 营销推广类规定报告范文  # 真人cs推广营销宣传  # 句容网站建设开发  # 柿子营销推广方案策划怎么写  # 有哪些  # 文档  # 的是  # 将其  # 如何用  # 转换为  # 实根  # 重定向  # red  # 网络问题  # win  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 高德地图沿途添加点失败如何解决 高德多点规划方法  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  QQ官网正版登录链接 QQ在线登录入口最新  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  J*aScript中高效管理与清空动态列表:避免循环陷阱  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  妖精动漫免费平台 妖精动漫官网资源观看网址  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  outlook中文官网入口地址 outlook官方中文版直达首页链接  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  微信网页版官方入口直达 微信网页版网页版登录使用方法  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  Lar*el 8 多关键词数据库搜索优化实践  Angular中父组件异步更新子组件复选框状态的实践指南  圆通快递查询实时追踪 圆通物流包裹状态快速查看  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  React Hooks最佳实践:动态组件状态管理的组件化方案  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  怎么在mac上运行html代码_mac运行html代码方法【指南】  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  J*aScript动态修改指定div内所有a标签样式指南  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  AO3官方在线访问地址 Archive of Our Own最新镜像合集  AO3最新可访问网址 Archive of Our Own官方在线入口  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  抖音网页版快捷访问 抖音网页版网页版入口操作教程  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  AO3官网镜像链接 Archive of Our Own同人文在线浏览  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  《噬血代码2》新预告片发布 展示游戏剧情  知音漫客官网漫画下载_知音漫客网页版阅读记录  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  漫蛙官网正版漫画入口 漫蛙2官方网页登录地址  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  2026年CSGO开箱网站推荐 CSGO开箱平台精选  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正 

搜索