如果使用双斜杠设置 会发生什么?

2024-03-24

我喜欢了解如何使用<base href="" />对我的网络爬虫来说很有价值,所以我用主要浏览器测试了几种组合,最后发现了一些我不明白的带有双斜杠的东西。

如果您不喜欢阅读所有内容,请跳至测试结果D and E。所有测试演示:
http://gutt.it/basehref.php http://gutt.it/basehref.php

一步一步我的通话测试结果http://example.com/images.html:

A - 多个基本 href

<html>
<head>
<base target="_blank" />
<base href="http://example.com/images/" />
<base href="http://example.com/" />
</head>
<body>
<img src="/images/image.jpg">
<img src="image.jpg">
<img src="./image.jpg">
<img src="images/image.jpg"> not found
<img src="/image.jpg"> not found
<img src="../image.jpg"> not found
</body>
</html>

结论

  • 只有第一个<base> with href counts
  • 来源以/目标为根
  • ../向上移动一个文件夹

B - 没有尾部斜线

<html>
<head>
<base href="http://example.com/images" />
</head>
<body>
<img src="/images/image.jpg">
<img src="image.jpg"> not found
<img src="./image.jpg"> not found
<img src="images/image.jpg">
<img src="/image.jpg"> not found
<img src="../image.jpg"> not found
</body>
</html>

结论

  • <base href>忽略最后一个斜杠之后的所有内容,所以http://example.com/images变成http://example.com/

C——应该怎样

<html>
<head>
<base href="http://example.com/" />
</head>
<body>
<img src="/images/image.jpg">
<img src="image.jpg"> not found
<img src="./image.jpg"> not found
<img src="images/image.jpg">
<img src="/image.jpg"> not found
<img src="../image.jpg"> not found
</body>
</html>

结论

  • 结果与中相同Test B正如预期的那样

D - 双斜线

<html>
<head>
<base href="http://example.com/images//" />
</head>
<body>
<img src="/images/image.jpg">
<img src="image.jpg">
<img src="./image.jpg">
<img src="images/image.jpg"> not found
<img src="/image.jpg"> not found
<img src="../image.jpg">
</body>
</html>

E - 带空格的双斜杠

<html>
<head>
<base href="http://example.com/images/ /" />
</head>
<body>
<img src="/images/image.jpg">
<img src="image.jpg"> not found
<img src="./image.jpg"> not found
<img src="images/image.jpg"> not found
<img src="/image.jpg"> not found
<img src="../image.jpg">
</body>
</html>

两者都不是“有效”URL,而是我的网络爬虫的真实结果。请解释一下发生了什么D and E that ../image.jpg可以找到,为什么会导致空白差异?

只为您的兴趣:

  • <base href="http://example.com//" />是相同的Test C
  • <base href="http://example.com/ /" />是完全不同的。仅有的../image.jpg被发现
  • <base href="a/" />只找到/images/image.jpg

的行为base http://www.w3.org/TR/html5/document-metadata.html#the-base-elementHTML 规范中对此进行了解释:

The base http://www.w3.org/TR/html5/document-metadata.html#the-base-element元素允许作者指定文档库 网址 http://www.w3.org/TR/html5/infrastructure.html#document-base-url为了解析相对 URL http://www.w3.org/TR/html5/infrastructure.html#resolve-a-url.

如测试 A 所示,如果有多个base with href, the 文档基础 URL http://www.w3.org/TR/html5/infrastructure.html#document-base-url将是第一个。

解析相对 URL http://www.w3.org/TR/html5/infrastructure.html#resolve-a-url是这样完成的:

应用网址解析器 http://www.w3.org/TR/html5/infrastructure.html#url-parser-0 to url, with base作为基本 URL,其中encoding作为编码。

The 网址解析 https://url.spec.whatwg.org/#url-parsing算法在 URL 规范中定义。

它太复杂了,这里无法详细解释。但基本上,发生的情况是这样的:

  • 以以下开头的相对 URL/是根据基本 URL 的主机计算的。
  • 否则,相对 URL 是根据基本 URL 的最后一个目录计算的。
  • 请注意,如果基本路径不以/,最后一部分将是一个文件,而不是目录。
  • ./是当前目录
  • ../向上移动一个目录

(Probably, "directory" and "file" are not the proper terminology in URLs)

一些例子:

  • http://example.com/images/a/./ is http://example.com/images/a/
  • http://example.com/images/a/../ is http://example.com/images/
  • http://example.com/images//./ is http://example.com/images//
  • http://example.com/images//../ is http://example.com/images/
  • http://example.com/images/./ is http://example.com/images/
  • http://example.com/images/../ is http://example.com/

请注意,在大多数情况下,//会像/. As 由 @poncha 说 https://stackoverflow.com/a/10161264/1529630,

除非您使用某种 URL 重写(在这种情况下 重写规则可能会受到斜杠数量的影响),uri 映射到磁盘上的路径,但在(大多数?)现代操作系统中 (Linux/Unix, Windows),连续多个路径分隔符不用 任何特殊含义,因此 /path/to/foo 和 /path//to////foo 会 最终映射到同一个文件。

不过,一般来说/ /不会成为//.

您可以使用以下代码片段将相对 URL 列表解析为绝对 URL:

var bases = [
  "http://example.com/images/",
  "http://example.com/images",
  "http://example.com/",
  "http://example.com/images//",
  "http://example.com/images/ /"
];
var urls = [
  "/images/image.jpg",
  "image.jpg",
  "./image.jpg",
  "images/image.jpg",
  "/image.jpg",
  "../image.jpg"
];
function newEl(type, contents) {
  var el = document.createElement(type);
  if(!contents) return el;
  if(!(contents instanceof Array))
    contents = [contents];
  for(var i=0; i<contents.length; ++i)
    if(typeof contents[i] == 'string')
      el.appendChild(document.createTextNode(contents[i]))
    else if(typeof contents[i] == 'object') // contents[i] instanceof Node
      el.appendChild(contents[i])
  return el;
}
function emoticon(str) {
  return {
    'http://example.com/images/image.jpg': 'good',
    'http://example.com/images//image.jpg': 'neutral'
  }[str] || 'bad';
}
var base = document.createElement('base'),
    a = document.createElement('a'),
    output = document.createElement('ul'),
    head = document.getElementsByTagName('head')[0];
head.insertBefore(base, head.firstChild);
for(var i=0; i<bases.length; ++i) {
  base.href = bases[i];
  var test = newEl('li', [
    'Test ' + (i+1) + ': ',
    newEl('span', bases[i])
  ]);
  test.className = 'test';
  var testItems = newEl('ul');
  testItems.className = 'test-items';
  for(var j=0; j<urls.length; ++j) {
    a.href = urls[j];
    var absURL = a.cloneNode(false).href;
      /* Stupid old IE requires cloning
         https://stackoverflow.com/a/24437713/1529630 */
    var testItem = newEl('li', [
      newEl('span', urls[j]),
      ' → ',
      newEl('span', absURL)
    ]);
    testItem.className = 'test-item ' + emoticon(absURL);
    testItems.appendChild(testItem);
  }
  test.appendChild(testItems);
  output.appendChild(test);
}
document.body.appendChild(output);
span {
  background: #eef;
}
.test-items {
  display: table;
  border-spacing: .13em;
  padding-left: 1.1em;
  margin-bottom: .3em;
}
.test-item {
  display: table-row;
  position: relative;
  list-style: none;
}
.test-item > span {
  display: table-cell;
}
.test-item:before {
  display: inline-block;
  width: 1.1em;
  height: 1.1em;
  line-height: 1em;
  text-align: center;
  border-radius: 50%;
  margin-right: .4em;
  position: absolute;
  left: -1.1em;
  top: 0;
}
.good:before {
  content: ':)';
  background: #0f0;
}
.neutral:before {
  content: ':|';
  background: #ff0;
}
.bad:before {
  content: ':(';
  background: #f00;
}

您还可以使用以下代码片段:

var resolveURL = (function() {
  var base = document.createElement('base'),
      a = document.createElement('a'),
      head = document.getElementsByTagName('head')[0];
  return function(url, baseurl) {
    if(base) {
      base.href = baseurl;
      head.insertBefore(base, head.firstChild);
    }
    a.href = url;
    var abs = a.cloneNode(false).href;
    /* Stupid old IE requires cloning
       https://stackoverflow.com/a/24437713/1529630 */
    if(base)
      head.removeChild(base);
    return abs;
  };
})();
var base = document.getElementById('base'),
    url = document.getElementById('url'),
    abs = document.getElementById('absolute');
base.onpropertychange = url.onpropertychange = function() {
  if (event.propertyName == "value")
    update()
};
(base.oninput = url.oninput = update)();
function update() {
  abs.value = resolveURL(url.value, base.value);
}
label {
  display: block;
  margin: 1em 0;
}
input {
  width: 100%;
}
<label>
  Base url:
  <input id="base" value="http://example.com/images//foo////bar/baz"
         placeholder="Enter your base url here" />
</label>
<label>
  URL to be resolved:
  <input id="url" value="./a/b/../c"
         placeholder="Enter your URL here">
</label>
<label>
  Resulting url:
  <input id="absolute" readonly>
</label>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果使用双斜杠设置 会发生什么? 的相关文章

  • 谷歌浏览器自动填充所有密码输入

    我的问题 我必须打开谷歌来自动填充我网站上的登录信息 但是现在每当我想编辑我的帐户信息或编辑其他用户帐户信息 作为管理员 时 它都会尝试自动填充该登录数据 它在奇怪的地方填充了我的数据 问题似乎是 Chrome 会自动用某种密码填充任何输入
  • 在 Angular 中,如何动态地将某些单词包装在另一个 html 元素中?

    我有这个简单的角度组件 Component selector my component template p someString p export class MyComponent Input someString string som
  • 如何制作 HTML/CSS/JS 变色背景(如 Kahoot.it 那样)

    如何使用 html 和 css 以及可能的 javascript 制作类似于 waht 的颜色变化 褪色背景https kahoot it https kahoot it has 你应该学会检查和获取 keyframes bgcolor 0
  • 如何使用固定位置 div/ 的浮动、清除和溢出元素并排对齐两个 div/

    所以我一直在尝试将两个 div 并排对齐而不重叠 我有一个 div 将被固定为侧边栏 而右侧的 div 将被固定为内容 希望有人可以帮助我 body background color 444 margin top 0 margin bott
  • 为什么这个 CSS nowrap 不起作用?

    我试图阻止 bar top container div 包裹它的内容 无论页面有多宽 即两个选择应该始终出现在同一行 但是当页面宽度太小而无法容纳它们时 这不起作用一方面 我该如何解决这个问题 Styles bar top containe
  • Safari 的 Javascript 与 document.write 的问题

    我的问题只发生在 Safari 上 IE FF Chrome 和 Opera 都可以完美运行 我正在向 DOM 添加一个对象 与 YouTube 的方式完全相同 具体取决于 ActiveX 或 NPAPI 因此在确定写入对象类型后 我通过以
  • 禁用 Materialise Carousel 上的触摸

    看起来以前没有人问过这个问题 因为我几乎在互联网上寻找一个非常简单的答案 如何禁用在物化轮播上向左 向右滑动的功能 在 Materialize js 添加 编辑 var allowCarouselDrag true value functi
  • 使用 php 变量更改 css 类

    这里需要您的帮助 正如标题所示 我正在尝试使用 PHP 变量更改 css 类 所以基本上我想创建一个回显某些代码的循环 但我希望第一个循环中的 div 类有所不同 它应该被隐藏 这是我为使问题变得清晰而编写的简化代码 我不知道错误在哪里 请
  • addEventListener keydown 不起作用

    我在互联网上找到了一些基本的 Pong 代码 并尝试添加按键 代码在这里 http cssdeck com labs ping pong game tutorial with html5 canvas and sounds http css
  • PSD 到 html 转换 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 正确缩放 Javascript Canvas 游戏

    我正在尝试根据屏幕尺寸动态缩放画布游戏 我了解如何根据屏幕尺寸调整画布大小 但我也想调整内容大小 基本上我希望游戏在每台设备上看起来都一样 我目前遇到的问题是 当拥有 4k 屏幕的人玩游戏时 他们可以轻松看到整个地图 当有人的屏幕非常小时
  • 防止浏览器弹出警告窗口

    我正在尝试在新窗口中打开 jsp 页面 使用 JavaScriptwindow open产生浏览器警告 并且在某些情况下 firefox 将默认阻止弹出窗口 有没有办法解决这个问题 这不是恶意应用程序 它是内部用户工具 大多数浏览器不会阻止
  • 元标记内的属性 property="og:title" 是什么?

    我有网站源代码的摘录 这是做什么的属性属性代表什么 其目的是什么 og title是开放图元标签之一 og 属性定义社交图中的对象 例如 Facebook 使用它们 og title代表对象的标题 因为它应该出现在图表中 请参阅此处了解更多
  • 如何将水平 ul 列表中的项目与图像垂直对齐?

    我有以下 html 代码 div ul li a href index php site login About a li li a href index php site login FAQ a li li a href http twi
  • Video.js - 阻止点击播放功能

    我正在使用 video js 将视频嵌入到 HTML 页面中 它将用作仅适用于 ipad 的 Web 应用程序 因此我相信它使用的是本机 HTML5 播放器 我正在尝试禁用点击播放功能 以便用户必须使用控件 但我在这样做时遇到了麻烦 我尝试
  • z-index 属性到底如何工作?

    如何z index实际上工作吗 它是否对未指定的元素起作用position 它是否支持具有指定的元素 即将它们放在顶部 position 像这样的数字必须是负数吗 div below div div less below div div o
  • 页面其余部分完成加载后延迟加载 html5 视频

    我有一个视频元素用作我正在构建的页面底部部分的背景 我试图通过将 src 存储为 data src 属性并使用 jQuery 在其他资源加载后将其应用到 src 属性 因为它不是英雄图像或任何东西 我想加载海报以节省加载时间 然后稍后加载视
  • 元素上的框阴影行为

    Update 在我提交错误报告后 https bugs chromium org p chromium issues detail id 763337 https bugs chromium org p chromium issues de
  • 在 JavaScript 中引用 C# 变量

    我已经阅读了很多线程 但我不明白为什么这不起作用 我正在创建一个将用作导航栏的 SharePoint Web 部件 一切都很顺利 直到我尝试在 JS 代码中引用 C 变量 这是来自 VisualWebPart1UserControl asc
  • html 下钻下拉所选值未插入 MYSQL

    我有两个下拉列表 首先从数据库下拉填充 根据第一个下拉列表的选定值从数据库填充第二个下拉列表 document ready function c change function var c1 c selected text if c1 aj

随机推荐

  • 配置配置文件不支持无线配件配置功能

    从 Xcode 7 3 升级到 Xcode 8 后 出现错误 供应配置文件 iOS团队供应配置文件 没有 支持无线配件配置功能 我可以知道如何解决这个问题吗 您应该在苹果的开发者门户中启用它 转到 应用程序 ID 并编辑您的应用程序 检查W
  • Omniauth Facebook 不返回电子邮件和性别栏 4

    我需要从 Facebook 获取姓名 电子邮件 图像和性别 我正在获取姓名和图像 但电子邮件和性别不是从 Facebook 获取的 我这两天都在苦苦挣扎 谁能帮帮我 用户模型 def self from omniauth auth wher
  • 在 Kindle Fire 上调试 Adob​​e AIR 应用程序

    可能的 我认为要做到这一点 我需要将 Fire 上的 AIR 运行时升级到 3 但应用商店中的版本无法安装 据我所知 我无法创建既是强制运行时又是调试的 AIR apk 因此应用程序的调试版本必须在安装的 AIR 运行时上运行 由于 Fir
  • 如何创建从 C++17 中的可变参数模板推导的类型向量元组?

    我已经实现了一个集合类 它将元组向量转换为向量元组 它本质上是 AOS 到 SOA 的转换 此代码适用于两个模板类的示例 我试图通过使用可变参数模板使其更加通用 为了做到这一点 我需要为成员变量创建类型m col 在 C 17 中 是否可以
  • Java - 重置输入流

    我正在处理一些Java代码 其中有一个我读取了一次的InputStream 然后我需要以相同的方法再次读取它 问题是我需要将其位置重置为开头才能读取两次 我找到了一个解决该问题的黑客式解决方案 is mark Integer MAX VAL
  • 是否应该在客户端 jar 中提供依赖库?

    我们正在为其他内部应用程序提供一个客户端 jar 以连接到我们应用程序的 REST API 我们的 API 依赖于一些标准 Jakarta 库 将这些 JAR 文件包含在我们的客户端 jar 文件中是否是最佳实践 或者您只是记录依赖关系 并
  • 如何管理应用程序中到 Firebase 数据的动态路径

    我的 Firebase 中有如下数据 这是一个基于 Javascript 的 Web 应用程序 bids 400 1 50 00 2 60 00 401 1 55 00 2 65 00 400和401指的是拍卖号码 1 和 2 指的是每次拍
  • 如何使用filesaver.js

    在最新的 filesaver 文档中 给出了如何将 filesaver js 与 blobbuilder js 结合使用的示例 var bb new BlobBuilder bb append Lorem ipsum var fileSav
  • UISearchControllerDelegate - 搜索栏在表标题中不可见

    My UITableViewController正在符合新的UISearchControllerDelegate并且UISearchResultsUpdating 这是我的搜索栏设置代码 override func viewDidLoad
  • 在 C# 中从两个整数创建百分比值的最佳方法是什么?

    我有两个整数 我想将它们相除以获得百分比 这就是我现在所拥有的 int mappedItems someList Count x gt x Value null int totalItems someList Count int doubl
  • 在 WooCommerce 收到订单页面上的文本中添加客户电子邮件

    在 WooCommerce 中 在感谢 已收到订单页面的顶部 我添加了自定义文本 其中包含以下代码 add action woocommerce thankyou my order received text 1 0 function my
  • 动态渲染 React 风格组件时消除警告

    我在浏览器控制台中收到以下警告 react devtools backend js 3973 The component styled div with the id of sc dmRaPn has been created dynami
  • 作为类属性的变体类型的 VBA 数组

    我有一个处理多个数值数组 双精度类型 的类 并且还需要处理一个描述符数组 其中包括字符串和整数的混合 需要相应地用作字符串和数字 所以我决定创建一个变体类型的数组属性 不是包含数组的变体 但这似乎不起作用 而双精度数组却可以 具体来说 这种
  • Emacs - 无法使缓冲区提供保存工作

    当缓冲区未与文件关联时 我想让 Emacs 询问我是否要保存修改后的缓冲区 要打开新缓冲区 不访问文件 我的 emacs 文件中有以下函数 Creates a new empty buffer defun new empty buffer
  • Visual Studio - 使用从现有源创建项目向导时使用新筛选器而不是新文件夹

    我使用了 Visual Studio 2008 的从现有代码创建项目向导 但显然以这种方式创建的项目不允许您创建虚拟解决方案文件夹 而只允许您创建实际的系统文件夹 我想要标头文件 资源文件和源文件的标准项目设置 但我似乎无法创建所需的虚拟文
  • 如何在 MATLAB 中找到数组中的最大值及其索引?

    假设我有一个数组 a 2 5 4 7 返回最大值及其索引的函数是什么 例如 在我的例子中 该函数应返回 7 作为最大值 4 作为索引 函数是max 要获得第一个最大值 您应该这样做 val idx max a val是最大值并且idx是它的
  • Laravel Eloquent,仅选择存在关系的行

    我正在尝试从表中进行选择 但我只想选择具有现有关系的内容 例如 如果我有用户和评论 并且用户有很多评论 我想做类似的事情 User hasComments gt paginate 20 因此 我只想选择至少有 1 条评论的用户 并对该查询的
  • 更新到依赖项 24.2.0 后,在两个布局之间使用 FloatingActionButton 的渲染问题停止工作

    正如我在问题中提到的 我的 FloatingActionButton 位于两个布局之间 请检查经典示例here https stackoverflow com questions 24459352 how can i add the new
  • 如何让 Pylint 识别 NumPy 成员?

    我正在 Python 项目上运行 Pylint Pylint 多次抱怨无法找到 NumPy 成员 如何避免这种情况 同时避免跳过会员资格检查 从代码来看 import numpy as np print np zeros 1 4 当运行时
  • 如果使用双斜杠设置 会发生什么?

    我喜欢了解如何使用对我的网络爬虫来说很有价值 所以我用主要浏览器测试了几种组合 最后发现了一些我不明白的带有双斜杠的东西 如果您不喜欢阅读所有内容 请跳至测试结果D and E 所有测试演示 http gutt it basehref ph