一、什么是短链接(短网址)?
答:短链接(Short URL)是一种十分简短的URL,它代表了另一个更长的URL。短链接(短网址)的目的是使长URL更加易于记忆、分享和输入。在互联网上,有很多服务商提供短链接(短网址)的生成功能,这些服务会把一个十分简短的URL映射到一个更长的URL地址。如果用户访问一个短链接的时候,短链接服务会将用户重定向到对应的长URL。这个过程中,短链接服务通常会记录访问数据,如访问次数、访问来源等,有的服务还提供分析和跟踪功能。
二、短链接(短网址)有哪些优点?
答:短链接(短网址)的优点如下
1. 易记:短链接更简洁,更容易记忆。
2. 分享:在短信、社交媒体等环境中,短链接更便于分享。
3. 输入:在移动设备上,短链接更易于输入。
4. 跟踪:短链接服务通常能提供访问跟踪和分析功能。
5. 安全:防止微信、QQ拦截等,防封、防红。比如双十一期间,以拼多多为首的电商平台推出了砍价、拼团等较为“扰民”的活动,微信进行了大规模的封锁,拼多多等平台转向生成以短链接的方式进行传播,降低被封的概率,同时链接短了,也更容易用户传播分享。
6. 简化二维码:如果链接长度过长,生成的二维码图片过于复杂, 会降低二维码扫描的成功率,缩短后的网址二维码就会清晰容易识别。
7. 降低权重传递:网站将会传递权重给超链接所在的网站,为了网站不被沦为搜索引擎优化的坟场,使用短链接就比较合适了。之前是 A网站 > B网站,A会传递给B权重,让搜索引擎认为B网站,这样就会有很多做网站的站长疯狂在A网站发链接,如果替换为短链接就变为: A网址 > 短链接 > B网站,这样A网站的权重并不会传递给B。
三、PHP如何完成短网址功能
第一步:准备工作
既然是短网址,那么我们必须要有一个足够短、容易记的域名。我申请了一个url8.icu,这个域名虽然不够优秀,但是也算是好记得了,也够短。
第二步:创建一个Mysql数据表

第三步:来写PHP代码
假设我们通过index.php来处理所有业务。我先设置伪静态规则,目的是不管用户访问任何路径,最终都由index.php来进行处理业务。
Nginx的伪静态规则:
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}Apache伪静态规则:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>那么我们index.php的代码就可以写成:
<?php
require 'class.php';
//我们通过$_SERVER['REQUEST_URI']取得用户访问的URL,比如:https://www.wslogs.cn/1
//这里我们规定短链接参数大于1小于6
if(strlen($_SERVER['REQUEST_URI']) <= '7' && strlen($_SERVER['REQUEST_URI']) > '2'){
$strlen = strlen($_SERVER['REQUEST_URI']);//取得参数长度
//由于$_SERVER['REQUEST_URI']获取的参数包括‘/’,所以需要去除
$result = substr($_SERVER['REQUEST_URI'], 1, $strlen);
if(isAlphanumeric($result)){
//这里的isAlphanumeric()是我们在class.php里设置的自定义函数,只返回由数字和大小写字母组成的数据
$url = queryDataById($pdo, $result, '');//这里查询数据库是否存在对应的原始URL
}else{
$url = false;
}
if($url !== false){
// 设置重定向的URL,这里使用302重定向,你还可以使用JS代码或者HTML头部声明
updateData($pdo, $result);//统计访问次数
header('HTTP/1.1 302 Moved Temporarily');
header('Location: ' . $url);
exit;
}else{
die('未定义网址');
}
}else{
die('无效网址');
}
?>可以看出index.php需要引用class.php,那么我们现在来完成class.php的代码:
<?php
$host = 'localhost';//mysql数据库IP地址
$db = 'dbname';//你的数据库名称
$user = 'dbuser';//你的数据库账号
$pass = 'dbpass';//数据库密码
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->Code());
}
// 插入新数据
function insertData($pdo, $string, $url) {
$stmt = $pdo->prepare("INSERT INTO url (string, url, time, nums) VALUES (?, ?, ?, ?)");
$stmt->execute([$string, $url, time() ,0]);
}
// 更新数据
function updateData($pdo, $String) {
// 使用参数化查询来防止 SQL 注入
$stmt = $pdo->prepare("UPDATE url SET time = ?, nums = nums + 1 WHERE string = ?");
// 执行语句,传入当前时间和字符串参数
$stmt->execute([time(), $String]);
}
// 删除数据
function deleteData($pdo, $string) {
$stmt = $pdo->prepare("DELETE FROM url WHERE string = ?");
$stmt->execute([$string]);
}
// 根据指定字符串或者URL查询数据
function queryDataById($pdo, $string = null, $url = null) {
// 检查输入参数是否为空,使用===来确保是null而不是false
if ($string === null && $url === null) {
// 如果没有有效参数,返回默认的URL
$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"], 0, 5)) === 'https' ? 'https://' : 'http://';
$url = $protocol . $_SERVER['HTTP_HOST'];
return $url;
}
// 准备SQL语句,并执行查询
$stmt = $pdo->prepare("SELECT * FROM url WHERE string = ? OR url = ?");
$parameters = [$string, $url];
$stmt->execute($parameters);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// 确保查询结果非空
if ($row) {
// 获取url字段值
if($string == null){
return $row['string'];
}elseif($url == null){
return $row['url'];
}
} else {
// 如果查询结果为空,返回当前请求的URL
return false;
}
}
//生成随机6位短网址
function generateRandomString($length = null) {
// 定义字符集
if($length === null){
$length = 6;
}
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
// 生成随机字符串
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
function isAlphanumeric($string) {
return ctype_alnum($string);
}
function GetVars($name, $type = 'REQUEST', $default = null)
{
if (empty($type)) {
$type = 'REQUEST';
}
$array = &$GLOBALS[strtoupper("_$type")];
if (array_key_exists($name, $array)) {
// 使用正则表达式来移除潜在的危险字符
$value = preg_replace('/[^a-zA-Z0-9]/', '', $array[$name]);
// 如果过滤后的值不为空,则返回,否则返回默认值
return $value !== '' ? $value : $default;
} else {
return $default;
}
}
function isSafeUrl($url) {
// 正则表达式来匹配基本的URL格式
$pattern = '|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i';
// 使用preg_match来检查字符串是否符合正则表达式
return preg_match($pattern, $url) === 1;
}
?>该教程没有写功能界面,只写了核心的PHP代码。你可以通过phpmyadmin直接在数据库中手动插入数据来进行测试,是否存在问题。当让你你还可以写一个HTML页面,来提交表单让PHP插入对应数据。处理表单的示例代码:
<?php
require 'class.php';
if(isSafeUrl($_POST['url'])){
$url = $_POST['url'];
$checkurl=queryDataById($pdo,'',$url);//检查提交的url是否已经存在数据库中
if($checkurl == false){//如果提交的URL不在数据库中
$randomString = '';
do {
$randomString = generateRandomString();
} while (queryDataById($pdo, $randomString, ''));
insertData($pdo, $randomString, $url);
echo '您的短网址是:https://www.wslogs.cn/'.$randomString;
}else{
echo '该URL已经存在对应的短网址:https://www.wslogs.cn/'.$checkurl;
}
?>提示:本文只是写了一个简单的教程,你可以参考本文中的代码进行完善以满足你的需求。你可以点击这里进行功能测试!页面预览:









