【HTML并不简单】笔记1-常用rel总结:nofollow、noopener、opener、noreferrer,relList

news2024/12/23 19:33:13

文章目录

    • rel="nofollow"
    • rel="noopener"与rel="opener"
    • rel="noreferrer"
    • relList对象

《HTML并不简单:Web前端开发精进秘籍》张鑫旭,一些摘要:

HTML,这门语言的知识体系非常庞杂,涉及Web交互开发、SEO(搜索引擎优化)​、安全、无障碍访问等各个领域,并不仅仅是单纯的标签结构。
大家之所以对HTML有错误认知,一是因为不关心,二是因为认为它可替代,三是因为它缺少好的科普著作。

过去,这是前端开发中的常识,而如今却是冷知识,知者甚少。
一方面是因为前端知识图谱更广了,从业者学习的精力有限,无暇顾及这部分内容;另一方面是产品形态更加多样化,例如移动端产品、工具类产品是不需要SEO知识的;当然,还有一部分原因是,这些知识的匮乏对业务收益的影响是不可见的,或者可以通过其他策略规避因开发人员不懂rel="nofollow"给产品带来的损失。


a元素,想要跳转到某个页面,使用href属性即可。若想新窗口打开目标页面,则:

<a href="/" target="_blank">首页</a>

即可。


a元素支持rel属性。
HTML 属性:rel - HTML(超文本标记语言) | MDN (mozilla.org)

在这里插入图片描述
我们这里关注几个值:

  • nofollow
  • noopeneropener
  • noreferrer

rel=“nofollow”

给a元素设置rel="nofollow"是SEO中的常用策略,用来告诉搜索引擎不要追踪这个链接。一般情况下,有两种情况需要设置此属性:

  • 目标页面是无效信息,或含有敏感信息
  • 目标是外站,不希望共享权重

不希望共享权重的详细描述:

SEO中有个策略,如果一个权重很高的网站,直接外链一个权重不高的中小网站,同时没有设置rel=“nofollow”,那么这个中小网站的权重有一定的概率会被提高

如果不想权重外泄,可以设置此属性。

相关链接:

何为Nofollow及如何正确地使用? - 知乎 (zhihu.com)

如何用其他方法规避不懂rel="nofollow"带来的损失?

方法:将所有的外链都换成本站地址进行中转

专门申请一个域名,A网站想要外联B网站,点击B网站先跳到中转站,再跳去B网站。这样可以避免权重外泄,也可以统计外链的点击量。

CSDN就是这样做的:
在这里插入图片描述

https://link.csdn.net/?from_id=xxxxxxxx&target=https%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F315000749

rel="noopener"与rel=“opener”

省流版:如果是不信任的链接地址,只要是新窗口打开的target="blank",一定要设置rel="noopener"

有场景如下:

主页面有一个“登录”按钮,点击后会开启一个新窗口进行登录,现在希望用户登录成功后,主页面自动刷新,该如何实现?

或许可以用以下方法:

  • visibilitychange事件
  • postMessage实现跨页面通信
document.addEventListener('visibilitychange',function(){
	if(document.visibilitychange==='visible'){
		// 登陆成功
	}
})

但是这两种方法,要么有运行冗余外加执行时机滞后的问题,要么学习成本高,不好。

本小节的rel='opener'就可以精确又轻松地实现上述需求:

<a href="/" target="_blank" rel="opener">登录</a>

在登录成功后,执行:

window.opener.location.reload()

但是,这样会有安全隐患。window对象的权限太高了,不仅挂载在window对象上的属性和方法可以被执行,任何document对象的属性和方法也可以被执行,因为document对象可以通过window.document访问。

有可能出现被恶意修改主页面内容,或被人通过window.opener.document.cookie获取用户的敏感信息并进行身份伪造等。

作者写了一个页面来演示这种情况:https://www.htmlapi.cn/2/1-1.html

在2021年以前,很多浏览器针对新窗口打开的链接,都是默认放开window.opener的,即,如有链接如下:

<a href="https://www.aaa.com" target="_blank">登录</a>

那么,此网站www.aaa.com可以通过window.opener对来源页面为所欲为,无论是跳转到恶意网站、注入恶意信息、伪造用户身份,都是有可能的。

因此,那时有一个技术常识,设置了target="blank"的外站一定要设置rel="noopener",这样,外站页面的window.operer就是null,也就没有安全隐患了。

不过,从2020年开始,许多浏览器设置target="blank"的链接元素默认不再是operer,而是noopener。但是,我们还是要手动设置rel="noopener",以防万一。

对于上述场景的需求,让我们看看gpt怎么说:

  1. 在主页面中,创建一个链接,点击该链接会在新窗口中打开登录页面:
<a href="/login" target="_blank" rel="noopener noreferrer">登录</a>
  1. 在新窗口的登录成功后的处理逻辑中,添加一行代码,用于刷新主页面:
if (window.opener) {
  window.opener.location.reload();
}

这段代码检查window.opener是否存在,如果存在(即当前窗口是由另一个窗口打开的),则刷新打开当前窗口的窗口。

请注意,出于安全原因,你应该总是在使用target="_blank"时添加rel="noopener noreferrer"属性。这可以防止新窗口通过window.opener修改打开它的窗口的location,并防止Referer Header泄露信息。

rel=“noreferrer”

首先要了解document.referrer这个API。

document.referrer可以返回当前页面的来源地址(当前页面的上一个页面)。用户可以直接在浏览器的地址栏输入URL地址进行访问。若通过设置了rel='noreferrer'的链接元素访问,那么document.referrer就是空字符串。

如edge首页:

在这里插入图片描述

如我从内容管理访问我自己的文章:

在这里插入图片描述

所有知名的网站分析工具,如百度统计和谷歌分析,都是通过document.referrer来判断多少 PV(页面访问量) 来自搜索引擎,多少PV来自社交媒体,以及多少PV来自直接访问的。

我们可以借用document.referrer来完成一些开发任务,与细节体验相关。有两个例子。

例一:

在移动端开发中,页面左上角往往会有一个“返回”按钮,但如果用户是通过点击某个分享链接进入的,那么这个返回的逻辑就不对,因为并没有上一页,此时这个“返回”按钮显示为“主页”按钮更合适。此时,我们就可以使用document.referrer来优化此细节,如果document.referrer是空字符串,则点击左上角的按钮会回到首页;如果不是,则会返回上一页。

例二:

在某列表页面,点击任意列表会进入详情页,然后希望再次返回(通过页面内链接,而非浏览器的“后退”按钮)到列表页的时候,页面依然定位在之前的滚动位置,但如果是从其他页面进入的,则滚动置顶。

可以通过在路由里加参数实现,若从列表项返回则:

<a href='/list.html?from=detail'>返回列表<a>

若从其他地方返回,则没有此参数:

<a href='/list.html?from=detail'>返回列表<a>

但是这样不够优雅,产生了副作用。可以使用浏览器自带的API:

if(/detail\.html/.test(document.referrer)){
 // 为true说明来源页面,即上一个页面是detail.html,即从详情页来的,执行滚动还原
}

例如,如果用户从"http://example.com/detail.html"页面导航到当前页面,那么这个if语句将为true,并执行其内部的代码。如果用户从"http://example.com/otherpage.html"或直接在浏览器中输入URL来访问当前页面,那么这个if语句将为false,并跳过其内部的代码。

作者提供的例子:https://www.htmlapi.cn/2/1-2.html

那么,我们要在什么时候给链接设置rel="noreferrer"

  • 自己产品的链接都不要设置:设置了会影响用户访问路径的追踪,进而影响页面的流失率等数据的统计
  • 外站链接,作者建议都设置:URL中含有大量信息,甚至有隐私内容,如搜索结果落地页的URL会包含搜索关键词,最好不要泄露
  • 若产品是社交媒体,可以不设置:如微博、知乎等。这种产品以社交为主,更看重信息传播。暴露referrer信息有助于第三方网站溯源,间接增加访问量和热度。

(如上述截图,CSDN也没有设置)

注意,我们会经常看见如下代码,即noopener和noreferrer同时设置:

<a href='xxxx' target="_blank" rel="noopener noreferrer">外部网站<a>

但是,社交媒体就不担心隐私泄露了吗?实际上,rel="noreferrer"的确存在不足,其设置与否的效果就像是0和1,并没有折中的说法,也就是说,无法兼顾信息传播和隐私保护

于是,2016年,各大浏览器开发商陆续支持一个新的HTML属性,referrerpolicy,可以兼顾信息传播和隐私保护,之后会讲。

还有一种少见的场景:

链接地址直接是外部图片,而这个图片设置了防外链,此时,给链接元素设置rel="noreferrer"有可能让图片可以访问。如:https://www.htmlapi.cn/2/1-3.html

原因:

防止热链的策略通常是通过检查HTTP的Referer头来实现的。当你从一个网页访问另一个网页时,你的浏览器会发送一个Referer头,告诉服务器你是从哪个页面跳转过来的。如果服务器发现Referer头不是它期望的值(例如,不是同一域名下的页面),那么它可能会拒绝提供服务,例如不返回图片内容。
rel="noreferrer"属性会告诉浏览器在请求资源时不要发送Referer头。 这样,即使图片的服务器设置了防止热链的策略,也无法检查Referer头,因此可能会正常提供服务。

对于作者例子https://www.htmlapi.cn/2/1-3.html,若图片被浏览器缓存了,点第一个链接也可以访问到图片(点完第二个再点第一个就可以访问了,因为缓存了)。

relList对象

对于rel="noopener noreferrer",我们发现rel属性支持使用空格分隔多个值。相似地,class也可以。

class可以用classList.remove移除某个类。rel也可以:使用relList.remove移除某个rel。

它们有专门的接口interface:DOMTokenList

DOMTokenList - Web API | MDN (mozilla.org)

rel属性要比很多人预想的要强大得多,具有其他HTML属性所没有的、独立的API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows开发工具使用技巧全面指南

目录 目录 Visual Studio 功能概述 使用技巧 快捷键表 Visual Studio Code 功能概述 常用扩展 使用技巧 PowerShell 功能概述 常用命令 脚本编写技巧 Git for Windows 功能概述 集成技巧 常用命令表 调试工具 Visual Studio调试器 使用技巧 WinDbg 使用技…

828华为云征文|部署音乐流媒体服务器 mStream

828华为云征文&#xff5c;部署音乐流媒体服务器 mStream 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 mStream3.1 mStream 介绍3.2 mStream 部署3.3 mStream 使用 四、…

UE4完整教程 UE4简介 UE4学习攻略及文件格式

开头附上工作招聘面试必备问题噢~~包括综合面试题、无领导小组面试题资源文件免费!全文干货。 UE4简介学习攻略UE4Demo代码面试内容资源-CSDN文库https://download.csdn.net/download/m0_72216164/89825102 工作招聘无领导小组面试全攻略最常见面试题(第一部分)共有17章+可…

PCL 点云模型滤波(圆形)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 生成点云数据 2.1.2 模型滤波函数 2.1.3 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xf…

「JavaScript深入」彻底理解JS中的闭包

JavaScript深入 — 闭包 一、概念二、示例三、实用的闭包四、用闭包模拟私有方法五、一个常见错误&#xff1a;在循环中创建闭包&#x1f330; 另一个经典例子-定时器与闭包 六、优劣好处坏处解决 七、图解闭包八、应用 &#x1f4aa;封装私有变量函数工厂异步操作中的回调函数…

css中背景色、背景图的使用

1、同时使用背景色、背景图片 参考链接&#xff1a;链接 以下样式&#xff0c;背景色在图片下方(缺点&#xff1a;图片不透明时&#xff0c;背景色会被完全遮挡。) .header {height: 100%;width: 100%;background-color: #000;background-image: url(/static/images/back.pn…

云原生之运维监控实践-使用Prometheus与Grafana实现对MySQL和Redis服务的监测

背景 如果你要为应用程序构建规范或用户故事&#xff0c;那么务必先把应用程序每个组件的监控指标考虑进来&#xff0c;千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章&#xff0c;当…

数据结构之手搓顺序表(顺序表的增删查改)

目录 文章目录 前言 一、什么是顺序表&#xff1f; 二、动态顺序表的实现 1.头文件定义 2.实现顺序表的初始化 3.检查顺序表空间容量是否足够&#xff0c;不够就增容 4.顺序表的销毁 5.顺序表的打印 6.顺序表的尾插 7.顺序表的头插 8.顺序表的头删 9.顺序表的尾删 10.顺序…

LeetCode题练习与总结:二叉树的所有路径--257

一、题目描述 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","1->…

RabbitMQ基本原理

一、基本结构 所有中间件技术都是基于 TCP/IP 协议基础之上进行构建新的协议规范&#xff0c;RabbitMQ遵循的是AMQP协议&#xff08;Advanced Message Queuing Protocol - 高级消息队列协议&#xff09;。 生产者发送消息流程&#xff1a; 1、生产者和Broker建立TCP连接&#…

国庆同欢,祖国昌盛!肌肉纤维启发,水凝胶如何重构聚合物

在这个国庆佳节&#xff0c;我们共同感受祖国的繁荣昌盛&#xff0c;同时也迎来了知识的探索之旅。今天来了解聚合物架构的重构的研究——《Hydrogel‐Reactive‐Microenvironment Powering Reconfiguration of Polymer Architectures》发表于《Advanced Science》。材料科学不…

【数据结构与算法】算法和算法分析

文章目录 一.算法1.定义2.描述 二.算法与程序三.算法特性四.算法效率的度量4.1算法时间事前分析法算法时间复杂度的渐进表示法分析算法时间复杂度的基本方法 4.2算法空间 数据的逻辑结构映像到内存就是数据的存储结构&#xff0c;针对数据的逻辑结构可以选择多种存储结构。数据…

Kotlin:2.0.0 的新特性

一、概述 kotlin 2.0.0版本英文官方文档 The Kotlin 2.0.0 release is out and the new Kotlin K2 compiler is Stable! Additionally, here are some other highlights: Kotlin 2.0.0发布了&#xff0c;新的Kotlin K2编译器已经稳定了。此外&#xff0c;以下是其他一些亮点: …

Linux操作系统中dubbo

1、简介 dubbo框架是做微服务通信的&#xff0c;是由阿里巴巴开发&#xff0c;后捐赠给阿帕奇基金会。 2、与OpenFeign的区别 dubbo是采用RPC协议实现微服务通信&#xff0c;OpenFeign是采用Http请求的方式实现的。 OpenFeign 最简单的&#xff0c;就是Spring公司开发的&am…

TinyAP:使用TinyML对抗Wi-Fi攻击的智能接入点

论文标题&#xff1a; 英文&#xff1a;TinyAP: An intelligent Access Point to combat Wi-Fi attacks using TinyML中文&#xff1a;TinyAP&#xff1a;使用TinyML对抗Wi-Fi攻击的智能接入点 作者信息&#xff1a; Anand Agrawal 和 Rajib Ranjan Maiti&#xff0c;来自印…

C语言常用标准库 -- 5.<time.h>

目录 引言 5. C标准库--time.h 5.1 简介 5.2 常量与宏 5.3 库变量 5.4 库宏 5.5 库函数 5.6 注意事项 &#x1f308;你好呀&#xff01;我是 程序猿 &#x1f30c; 2024感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能&#xff0c;…

线程池面试集

目录 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优雅的停止一个线程? 线程池的核心线程数、最大线程数该如何设置? 如何理解Java并发中的可见性、原子性、有序性? Java死锁如何避免? 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优…

【docker学习】Linux系统离线方式安装docker环境方法

centos7-linux安装docker(离线方式) 下载docker的安装文件 https://download.docker.com/linux/static/stable/x86_64/ 下载的是&#xff1a;docker-18.06.3-ce.tgz 这个压缩文件 将docker-18.06.3-ce.tgz文件上传到centos7-linux系统上&#xff0c;用ftp工具上传即可 解压…

《RabbitMQ篇》基本概念介绍

MQ功能 解耦 MQ允许不同系统或组件之间松散耦合。发送者和接收者不需要直接连接&#xff0c;从而提高了系统的灵活性和可维护性。异步处理 使用MQ可以实现异步消息传递&#xff0c;发送者可以将消息放入队列后立即返回&#xff0c;不必等待接收者处理。这提高了系统的响应速度…

鸿蒙NEXT开发-ArkTS(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…