全方位站长技能、SEO优化学习平台
当前位置:网站首页 > PHP笔记 > 正文

PHP菜鸟教程:如何用PHP来做一个短网址(短链接)服务?

作者:文煞发布时间:2024-07-20分类:PHP笔记浏览:5316


温馨提示:手机扫码可阅读当前文章!
文章简介:一、什么是短链接(短网址)?答:短链接(Short URL)是一种十分简短的URL,它代表了另一个更长的URL。短链接(短网址)的目的是使长URL更加易于记忆、分享和输入。在互联网上,有很多服务商提供短链接(短网址)的生成功能,这些服务会把...

一、什么是短链接(短网址)?


答:短链接(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菜鸟教程:如何用PHP来做一个短网址(短链接)服务?  第1张

第三步:来写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.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;
    }
?>

提示:本文只是写了一个简单的教程,你可以参考本文中的代码进行完善以满足你的需求。你可以点击这里进行功能测试!页面预览:

PHP菜鸟教程:如何用PHP来做一个短网址(短链接)服务?  第2张


欢迎您,来自美国的朋友,您的IP:3.145.102.18,您的网络:Amazon_EC2服务器


PHP笔记排行
随机推荐
猜你喜欢

服务热线

1888888888

要发发发发发发

站长微信公众号

站长微信公众号

分享:

支付宝

微信