服务热线
1888888888
作者:文煞发布时间:2024-07-20分类:PHP笔记浏览:5316
答:短链接(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。
既然是短网址,那么我们必须要有一个足够短、容易记的域名。我申请了一个url8.icu,这个域名虽然不够优秀,但是也算是好记得了,也够短。
假设我们通过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.wsbjw.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.wsbjw.cn/'.$randomString; }else{ echo '该URL已经存在对应的短网址:https://www.wsbjw.cn/'.$checkurl; } ?>
提示:本文只是写了一个简单的教程,你可以参考本文中的代码进行完善以满足你的需求。你可以点击这里进行功能测试!页面预览:
分享:
支付宝
微信