编程 PHP来做一个短网址(短链接)服务

2024-11-17 22:18:37 +0800 CST views 633

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

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

短链接(Short URL)是一种简短的URL,用来映射更长的URL地址。当用户访问短链接时,短链接服务会将用户重定向到对应的长URL。这种服务还可以记录访问数据,如访问次数、来源等。

二、短链接(短网址)的优点

  1. 易记:简短的链接更容易记忆。
  2. 便于分享:适合在短信、社交媒体中分享。
  3. 易输入:移动设备上更方便输入。
  4. 跟踪:可以提供访问跟踪和分析功能。
  5. 安全:降低微信、QQ等的封锁风险。
  6. 简化二维码:缩短后的网址生成的二维码更容易扫描。
  7. 降低权重传递:防止权重传递给其他站点,有利于SEO优化。

三、PHP实现短网址功能

第一步:准备工作

首先,申请一个简短易记的域名,例如url8.icu

第二步:创建Mysql数据表

你需要创建一个数据表来存储短链接和原始链接的映射关系,数据表示例如下:

CREATE TABLE `url` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `string` VARCHAR(6) NOT NULL,
  `url` TEXT NOT NULL,
  `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `nums` INT NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE (`string`)
) ENGINE=InnoDB;

第三步:PHP代码实现

1. Nginx和Apache的伪静态规则

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>

2. index.php代码

<?php
require 'class.php';

// 获取用户访问的URL路径
if (strlen($_SERVER['REQUEST_URI']) <= 7 && strlen($_SERVER['REQUEST_URI']) > 2) {
    $strlen = strlen($_SERVER['REQUEST_URI']);
    $result = substr($_SERVER['REQUEST_URI'], 1, $strlen);

    if (isAlphanumeric($result)) {
        $url = queryDataById($pdo, $result, '');
    } else {
        $url = false;
    }

    if ($url !== false) {
        updateData($pdo, $result);
        header('HTTP/1.1 302 Moved Temporarily');
        header('Location: ' . $url);
        exit;
    } else {
        die('未定义网址');
    }
} else {
    die('无效网址');
}
?>

3. class.php代码

<?php
$host = 'localhost';
$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->getCode());
}

// 插入新数据
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) {
    $stmt = $pdo->prepare("UPDATE url SET time = ?, nums = nums + 1 WHERE string = ?");
    $stmt->execute([time(), $string]);
}

// 查询数据
function queryDataById($pdo, $string = null, $url = null) {
    if ($string === null && $url === null) {
        return false;
    }
    $stmt = $pdo->prepare("SELECT * FROM url WHERE string = ? OR url = ?");
    $stmt->execute([$string, $url]);
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($row) {
        return $string === null ? $row['string'] : $row['url'];
    } else {
        return false;
    }
}

// 生成随机字符串
function generateRandomString($length = 6) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}

// 验证字符串是否是字母数字
function isAlphanumeric($string) {
    return ctype_alnum($string);
}

// 验证URL是否安全
function isSafeUrl($url) {
    $pattern = '|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i';
    return preg_match($pattern, $url) === 1;
}
?>

第四步:处理表单

可以通过HTML页面提交表单,让PHP插入对应数据,处理表单的代码示例:

<?php
require 'class.php';

if (isSafeUrl($_POST['url'])) {
    $url = $_POST['url'];
    $checkurl = queryDataById($pdo, '', $url);
    
    if ($checkurl == false) {
        do {
            $randomString = generateRandomString();
        } while (queryDataById($pdo, $randomString, ''));
        
        insertData($pdo, $randomString, $url);
        echo '您的短网址是:https://www.w.cn/' . $randomString;
    } else {
        echo '该URL已经存在对应的短网址:https://www.w.cn/' . $checkurl;
    }
}
?>

总结

本教程展示了如何通过PHP实现一个简单的短链接(短网址)服务,包括URL映射的数据库设计、PHP代码逻辑以及Nginx和Apache的伪静态规则。你可以根据需要扩展功能,例如添加访问统计、分析、用户登录等。通过这种服务,能够大大简化链接的分享和管理,提高用户体验。

复制全文 生成海报 编程 Web开发 PHP 数据库 短链接服务

推荐文章

mysql删除重复数据
2024-11-19 03:19:52 +0800 CST
使用Vue 3和Axios进行API数据交互
2024-11-18 22:31:21 +0800 CST
12 个精选 MCP 网站推荐
2025-06-10 13:26:28 +0800 CST
paint-board:趣味性艺术画板
2024-11-19 07:43:41 +0800 CST
Go 1.23 中的新包:unique
2024-11-18 12:32:57 +0800 CST
一个简单的html卡片元素代码
2024-11-18 18:14:27 +0800 CST
Elasticsearch 文档操作
2024-11-18 12:36:01 +0800 CST
Vue3中如何处理权限控制?
2024-11-18 05:36:30 +0800 CST
智慧加水系统
2024-11-19 06:33:36 +0800 CST
使用xshell上传和下载文件
2024-11-18 12:55:11 +0800 CST
PHP如何进行MySQL数据备份?
2024-11-18 20:40:25 +0800 CST
Web浏览器的定时器问题思考
2024-11-18 22:19:55 +0800 CST
Go 如何做好缓存
2024-11-18 13:33:37 +0800 CST
利用图片实现网站的加载速度
2024-11-18 12:29:31 +0800 CST
什么是Vue实例(Vue Instance)?
2024-11-19 06:04:20 +0800 CST
Vue3中如何实现国际化(i18n)?
2024-11-19 06:35:21 +0800 CST
Vue3中如何处理WebSocket通信?
2024-11-19 09:50:58 +0800 CST
php指定版本安装php扩展
2024-11-19 04:10:55 +0800 CST
你可能不知道的 18 个前端技巧
2025-06-12 13:15:26 +0800 CST
程序员茄子在线接单