一、为什么要使用短地址
使用短地址的主要目的是使长网址更简洁、易记和方便分享。以下是一些常见的原因:
- 美观简洁:长网址通常包含多个字符和参数,而短地址可以将其简化为几个字符,使URL更短更整洁。这样能够提升用户体验,使网址更美观。
- 方便记忆:长而复杂的网址往往不易记忆,特别是对于移动设备上的用户来说。而短地址通常采用简洁的字符组合,更容易被记住。
- 方便分享:短地址更适合在有限的空间内进行分享,如社交媒体、短信、聊天应用等。长地址可能会被截断或换行,导致无法正确打开目标页面,而短地址则可以避免这种问题。
- 隐藏真实地址:对于一些敏感信息或需要保密的内容,使用短地址可以隐藏真实的目标URL。这可以增加一定的安全性,防止用户通过直接访问长地址获取敏感信息。
- 网址统计和监控:使用短地址服务商提供的统计功能,可以追踪短地址的点击量、转化率等数据,方便进行数据分析和监控。这对于营销活动、推广链接等具有重要意义。
总之,使用短地址可以提升用户体验、简化网址、方便分享和统计,因此在很多场景下都可以考虑使用。
二、实现短地址的方式
- 自增数字短码:基于哈希算法,将长链接生成一个短字符串,并将短字符串和长链接保存在数据库中。以获取短链接时,通过短字符串查询数据库获取对应长链接,然后将用户重定向到该长链接。
- 数据库自增ID转换:将长链接的ID转换成62进制,再与预设域名组合成短链接。以获取短链接时,通过短链接中的62进制ID获取长链接,然后将用户重定向到该长链接。
- 使用第三方短链接服务,如bit.ly、goo.gl等。将长链接提交给服务提供商,获取短链接,并将其存储在数据库中。以获取短链接时,通过短链接重定向到服务提供商的接口,让其将用户重定向到长链接。
- 基于自己的短链接服务,使用分布式ID生成器(如Snowflake)生成唯一ID,并将其转换成短链接。以获取短链接时,根据短链接中的唯一ID获取长链接,并将用户重定向到该长链接。
三、实战开发示例
1.短地址用法说明
格式:https://test.com/t.php?t=21_1
/* * 短地址系统 * 为方便微信内传播,直接使用ID进行短域名缩写 * 参数方式:$Id_0 * $Id为加密方式密文 * _分割符号 * 0,项目链接,1,培训链接,2单位邀请注册 * By Woodcutter 2023-05-17 */
2.获取参数
$t = get_param('t'); $pid = explode("_", $t)[0]; $fromUrl = explode("_", $t)[1]; if (stripos($t, '_') == false) { die("参数错误,无法正常访问"); }
3.跳转条件判断
//判断跳转; switch ($fromUrl) { case "0";//项目分享 $row = $db->fetch('project', 'project_id', array('project_id' => $pid), ' project_id DESC'); if ($row['project_id']) { $url = 'app.php?m=Course&a=courseList&act=list&project_id=' . $row['project_id']; } else { die("项目信息不存在,无法访问"); } break; case "1";//培训分享 $row = $db->fetch('course', 'project_id,course_id', array('course_id' => $pid), ' course_id DESC'); if ($row['course_id']) { $url = 'app.php?m=Course&a=courseDetails&act=show&project_id=' . $row['project_id'] . '&course_id=' . $row['course_id']; } else { die("培训信息不存在,无法访问"); } break; case "2";//PC端单位分享 $row = $db->fetch('depart', 'depart_id,depart_name,depart_no,province,city,area', array('depart_id' => $pid), ' depart_id DESC'); if ($row['depart_id']) { $url = 'index.php?m=Index&a=register&depart_id=' . $row['depart_id'] . '&user_depart=' . UrlEncode($row['depart_name']) . '&depart_no=' . UrlEncode($row['depart_no']) . '&province=' . UrlEncode($row['province']) . '&city=' . UrlEncode($row['city']) . '&area=' . UrlEncode($row['area']); } else { die("单位信息不存在,无法访问"); } break; case "3";//手机端单位分享 $row = $db->fetch('depart', 'depart_id,depart_name,depart_no,province,city,area', array('depart_id' => $pid), ' depart_id DESC'); if ($row['depart_id']) { $url = 'app.php?m=Index&a=register&depart_id=' . $row['depart_id'] . '&user_depart=' . UrlEncode($row['depart_name']) . '&depart_no=' . UrlEncode($row['depart_no']) . '&province=' . UrlEncode($row['province']) . '&city=' . UrlEncode($row['city']) . '&area=' . UrlEncode($row['area']); } else { die("单位信息不存在,无法访问"); } break; case "4";//签到二维码分享 $row = $db->fetch('course', 'project_id,course_id', array('course_id' => $pid), ' course_id DESC'); if ($row['course_id']) { $url = 'app.php?m=Course&a=courseCheck&act=check&project_id=' . $row['project_id'] . '&course_id=' . $row['course_id']; } else { die("培训信息不存在,无法访问"); } break; default: die("短域名参数错误,无法正常访问。");
@漏刻有时