外链跳转页功能分析与实现

news2024/11/14 15:43:58

一个大型的正规网站,增加一个 外链中转页 是有必要的。合理的交互设计,不仅能有效保障用户体验,又能帮助网站收集外链数据,优化运营管理。

 

目录

1、为什么使用跳转页面来管理外链

1.1、安全性

1.2、搜索引擎优化

1.3、外链数据统计

1.4、外链网站引流

1.5、业务功能扩展

2、CSDN外链跳转页设计

3、外链跳转演示

3.1、跳转到外链-无参数

3.2、跳转到外链-有参数

3.3、跳转到本地/本网域页面

3.4、空地址

3.5、跳转到本页面/页面标签

3.6、跳转到无效地址

4、外链跳转逻辑实现


运行环境:

  • Windows-10-BusinessEditions-21h2-x64
  • Google Chrome-112.0.5615.50-x64
  • HTML5

1、为什么使用跳转页面来管理外链

1.1、安全性

  • 网站安全评级

        对外链进行识别、过滤,提醒用户即将跳转到外部网站。

        对外链网站进行安全评级,并进行黑白名单控制,把它认为不安全的网站直接拦截。

  • 用户隐私保护

        直接跳转,外链网站可以轻松拿到用户正在浏览页面的URL 和 UserAgent,有可能会造成用户信息泄露等安全和隐私问题。而通过跳转页中转,对HTTP请求头做特殊处理(如:去掉 Referer 请求头),被访问网站只能知道链接是来自本站。

  • JS安全漏洞

        可以有效的防止外链接网站通过访问 window.opener 修改原网站location的安全漏洞。

  • 域名SSL认证

        对于非HTTPS的外链域名,进行提示。

        通过SSL认证的中转域名来控制外链,整站的链接都是https。

1.2、搜索引擎优化

        如果外链的网站被搜索引擎降权,那么本网域名也会有被降权的风险,而使用 中转域名 跳转可以避免 主域名 产生这样的风险(注:可通过在a标签加上关系属性值 rel="nofollow" 来解决)。

1.3、外链数据统计

        用于链接分析,可以统计有多少用户点了外链?外链网站类型?

1.4、外链网站引流

        一般情况下,高权重的网站会严控给低权限的小网站引流。小网站要想通过大网站引流,是需要花钱买流量的。

1.5、业务功能扩展

在中转页面对外链接进行功能上的特殊处理,如:

  • 在中转页面放广告、推热点事件;
  • 对外链url添加参数(如:utm_source)进行不同的处理;

2、CSDN外链跳转页设计

​以下为CSDN跳转外链页,包括:本站Logo、警示语、外链URL、操作。

3、外链跳转演示

以下针对 a标签赋值的不同,进行举例演示。

3.1、跳转到外链-无参数

如:CSDN首页-无参数

3.2、跳转到外链-有参数

如:CSDN搜索-有参数

3.3、跳转到本地/本网域页面

  • 本例中的本地网页,如:file:///E:/Workplace/h5/LocalPage.html
  • 同域名二级子域名,如:https://blog.csdn.net/

3.4、空地址

空地址,默认打开当前页面,a标签 赋值为 空串,如:""

3.5、跳转到本页面/页面标签

打开当前页面,a标签 赋值为 #

3.6、跳转到无效地址

a标签 赋值为 一个无效的URL,如:ABC

4、外链跳转逻辑实现

        以下代码通过给 a标签 指定 class,实现外链中转控制,如果生产环境使用代理服务器(如:nginx),请根据实际需求调整JS代码。

        请将以下HTML保存为到本地(如:E:/Workplace/h5/rewriteUrl.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>外链跳转检测提示</title>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
    // 获取URL中的域名
    function getUrlDomain(objUrl) {
        // 非标准域名
        if (objUrl == "" || objUrl == "#" || objUrl.indexOf("//") == -1) {
            return "";
        }
        var urls = objUrl.split("//");
        var urlDomain = urls[1];
        var delimiterPosition = urlDomain.indexOf("/");
        if (delimiterPosition > 0) {
            urlDomain = urlDomain.substring(0, delimiterPosition);
        }
        var paramPosition = urlDomain.indexOf("?");
        if (paramPosition > 0) {
            urlDomain = urlDomain.substring(0, paramPosition);
        }
        // 此处根据需要添加逻辑,获取一级域名(对于相同一级域名的直接跳转,不弹出提示)
        
        return urlDomain;
    }
 
    // 站外链接跳转提示
    $("a.ext-link").click(function () {
        let gotoUrl = $(this).attr('href');
        if (gotoUrl == "" || gotoUrl == "#") {
            // 页面内跳转(如:页面标签)
            return true;
        } else if (gotoUrl.indexOf("//") == -1) {
            alert("非法链接");
            return false;
        }
        let gotoDomain = getUrlDomain(gotoUrl);
        let siteDomain = document.domain;
 
        console.log("gotoUrl: " + gotoUrl);
        console.log("gotoDomain: " + gotoDomain);
        console.log("siteDomain: " + siteDomain);
        
        // 非本站跳转则弹出提示
        if (gotoDomain != "" && siteDomain != gotoDomain) {
            // 此处也可以提交给后台的API处理
            
            return confirm(`您即将离开本站,去往【${gotoUrl}】`);
        }
    });
});
</script>
</head>
<body>
<ul>
<li><a href="https://www.csdn.net/" class="ext-link" target="_blank">CSDN首页-无参数</a></li>
<li><a href="https://so.csdn.net/so/search?q=狂龙骄子&t=blog" class="ext-link" target="_blank">CSDN搜索-有参数</a></li>
<li><a href="file:///E:/Workplace/h5/LocalPage.html" class="ext-link" target="_blank">本地文件</a></li>
<li><a href="" class="ext-link" target="_blank">空地址</a></li>
<li><a href="#" class="ext-link" target="_blank">本页地址</a></li>
<li><a href="ABC" class="ext-link" target="_blank">非法URL</a></li>
</ul>
</body>
</html>


附录:

  • 常见前端漏洞及防御方法之 a标签钓鱼攻击
  • 什么是UTM参数

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

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

相关文章

JVM学习(九):堆

一、堆&#xff08;Heap&#xff09;的概述 一个JVM实例只存在一个堆内存&#xff0c;堆也是Java内存管理的核心区域。 Java堆区在JVM启动的时候即被创建&#xff0c;其空间大小也就确定了。是JVM管理的最大一块内存空间。同时&#xff0c;堆内存的大小是可以调节的。《Java虚拟…

ESP32-硬件IIC读取温湿度传感器SHT30

简介 esp32 使用硬件I2C读取温湿度传感器SHT30,例程基于EDP-IDF-4.4.X 的I2C Simple Example 例程修改 工程创建 打开 VSCODE ,通过 查看-- 命令面板&#xff08;快捷键CtrlShiftP&#xff09;&#xff0c;打开 ESP-IDF 的例程后&#xff0c;选择 i2c_simple 例程&#xff0…

深度学习卷积神经网络学习小结

————————————————————————————————————————————— 学习小结&#xff1a; 1&#xff09;深度学习综述&#xff1b;&#xff08;2&#xff09;对卷积神经网络&#xff08;CNN&#xff09;的认识&#xff1b;&#xff08;3&#xff0…

C语言中函数宏的三种封装方式详解

目录 ​编辑 1. 函数宏介绍 3. do{...}while(0) 方式 4. ({}) 方式 5. 总结 1. 函数宏介绍 函数宏&#xff0c;即包含多条语句的宏定义&#xff0c;其通常为某一被频繁调用的功能的语句封装&#xff0c;且不想通过函数方式封装来降低额外的弹栈压栈开销。 函数宏本质上为…

Winform从入门到精通(37)—FolderBrowserDialog(史上最全)

文章目录 前言1、Name2、Description3、RootFolder4、SelectedPath5、ShowNewFolderButton前言 当需要获取一个可以通过用户自由选择路径的时候,这时候就需要FolderBrowserDialog控件 1、Name 获取FolderBrowserDialog对象 2、Description 用于指示对话框的描述,如下: …

leetcode刷题(10)二叉树(4)

各位朋友们&#xff0c;大家五一劳动节快乐啊&#xff0c;在这里祝大家假期玩得愉快&#xff01;但是在玩耍的期间不要忘记了敲代码哦。今天我为大家分享的是二叉树的第四篇&#xff0c;废话不多说&#xff0c;我们一起来看看吧。 文章目录 二叉树的最近公共祖先题目要求做题思…

Stable Diffusion Controlnet V1.1 的14种基础标志用法

用于ControlNet和其他基于注入的SD控件的WebUI扩展。 针对 AUTOMATIC1111 的 Stable Diffusion web UI 网络用户界面的扩展&#xff0c;它可以让网络界面在原始的 Stable Diffusion 模型中添加 ControlNet 条件来生成图像。这种添加是实时的&#xff0c;不需要进行合并。 Con…

【openAI】Whisper如何高效语音转文字(详细教程)

文章目录 前言一、准备二、使用Whisper进行语音转文字三.Whisper转换结果分析总结 前言 语音转文字在许多不同领域都有着广泛的应用。以下是一些例子&#xff1a; 1.字幕制作&#xff1a;语音转文字可以帮助视频制作者快速制作字幕&#xff0c;这在影视行业和网络视频领域非常…

【软件下载】换新电脑记录下下载的软件时所需地址

1.idea https://www.jetbrains.com/zh-cn/idea/download/other.html 2.oracle官方&#xff08;下载jdk时找的&#xff09; https://www.oracle.com/ 3.jdk8 https://www.oracle.com/java/technologies/downloads/ 下拉找到jdk8 切换windows &#xff08;需要注册个oracle账…

TabError: inconsistent use of tabs and spaces in indentation

错误原因是tab制表符和空格混用了。从其他地方复制源码容易出现此错误 解决办法&#xff1a;把处于同级缩进的所有缩进修改统一 比较流行的几个编辑器都能标识tab和空格&#xff0c;比如我用的vscode 用鼠标框选不知道是tab还是空格的部分。 若是空格则显示为上图73行所示的点…

自动化运维工具一Ansible Roles实战

目录 一、Ansible Roles概述 1.1.roles官方的目录结构 1.2.Ansible Roles依赖关系 二、Ansible Roles案例实战 2.1.Ansible Roles NFS服务 2.2 Roles Memcached 2.3 Roles-rsync服务 一、Ansible Roles概述 之前介绍了 Playbook 的使用方法&#xff0c;对于批量任务的部…

C++程序设计——常见C++11新特性

一、列表初始化 1.C98中{}的初始化问题 在C98中&#xff0c;允许使用花括号{}对数组元素进行统一的列表初始化值设定&#xff0c;比如&#xff1a; 但是对于一些自定义类型&#xff0c;就无法使用这样的方式进行初始化了&#xff0c;比如&#xff1a; 就无法通过编译&#xff…

HIT-CSAPP实验二gdb和edb的配置

笔者只是根据自己的电脑进行环境的配置&#xff0c;不一定适配所有的电脑&#xff0c;也不是万能的方法&#xff0c;如果读者使用本人的方法没有配置成功本人深表抱歉。 gdb的使用 通过网上查阅一些资料获得 gdb查看内存和寄存器以及中断设置&#xff08;转&#xff09;_gdb…

关于安装PicGo后启动无界面问题

关于安装PicGo后启动无界面问题 其实我遇到的这个也不算是问题&#xff0c;也挺无语的。 最近为了搭建图床&#xff0c;需要使用PicGo&#xff0c;第一次搭建图床也是第一次使用PicGo。在安装了PicGo后发现启动不了&#xff0c;查看后台发现PicGo在运行着&#xff0c;但是没有界…

数据结构与算法九 树进阶

一 平衡树 之前我们学习过二叉查找树&#xff0c;发现它的查询效率比单纯的链表和数组的查询效率要高很多&#xff0c;大部分情况下&#xff0c;确实是这样的&#xff0c;但不幸的是&#xff0c;在最坏情况下&#xff0c;二叉查找树的性能还是很糟糕。 例如我们依次往二叉查找…

User Experience Design and Information Architecture

&#x1f4a5;(1) What is IA (Information Architecture)? Definition of four sentences I. Information Architecture is "The structure design of shared informaiton environments-共享信息环境的结构设计" II. Information Architecture is "The sy…

ChatGPT提示词工程(三):Summarizing概括总结

目录 一、说明二、安装环境三、概括总结&#xff08;Summarizing&#xff09;1. 简单地概括总结&#xff0c;只有字数限制2. 概括总结需要关注的某些点 四、用“提取”代替“总结”&#xff08;Try "extract" instead of "summarize"&#xff09;五、概括总…

Mysql第二章 多表查询的操作

这里写自定义目录标题 一 外连接与内连接的概念sql99语法实现 默认是内连接sql99语法实现左外连接&#xff0c;把没有部门的员工也查出来sql99语法实现右外连接&#xff0c;把没有人的部门查出来sql99语法实现满外连接&#xff0c;mysql不支持这样写mysql中如果要实现满外连接的…

生成对抗网络原理

GAN的原理 GAN是在2014年由Ian Goodfellow等人提出的&#xff0c;发表在论文“Generative Adversarial Networks”中。 GAN的主要灵感来源于博弈论中零和博弈的思想&#xff0c;应用到深度学习神经网络上来说&#xff0c;就是通过生成网络G&#xff08;Generator&#xff09;和…

系统架构设计

高性能 客户端内部缓存客户端到服务器之间缓存&#xff1a;CDN,网络专线数据库前加缓存Sessioin等信息共享NoSQL数据库分片&#xff0c;读写分离web层无关态集群负载均衡GeoDNS 就近原则&#xff0c;边缘计算存储异步&#xff0c;解耦&#xff0c;削峰&#xff1a;消息队列离线…