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

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

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 数据库 短链接服务

推荐文章

PHP 微信红包算法
2024-11-17 22:45:34 +0800 CST
黑客帝国代码雨效果
2024-11-19 01:49:31 +0800 CST
JS中 `sleep` 方法的实现
2024-11-19 08:10:32 +0800 CST
浏览器自动播放策略
2024-11-19 08:54:41 +0800 CST
介绍 Vue 3 中的新的 `emits` 选项
2024-11-17 04:45:50 +0800 CST
JavaScript中设置器和获取器
2024-11-17 19:54:27 +0800 CST
Go语言中的mysql数据库操作指南
2024-11-19 03:00:22 +0800 CST
小技巧vscode去除空格方法
2024-11-17 05:00:30 +0800 CST
7种Go语言生成唯一ID的实用方法
2024-11-19 05:22:50 +0800 CST
如何将TypeScript与Vue3结合使用
2024-11-19 01:47:20 +0800 CST
Nginx 性能优化有这篇就够了!
2024-11-19 01:57:41 +0800 CST
使用 Vue3 和 Axios 实现 CRUD 操作
2024-11-19 01:57:50 +0800 CST
Go语言中的`Ring`循环链表结构
2024-11-19 00:00:46 +0800 CST
php curl并发代码
2024-11-18 01:45:03 +0800 CST
Vue3中如何扩展VNode?
2024-11-17 19:33:18 +0800 CST
goctl 技术系列 - Go 模板入门
2024-11-19 04:12:13 +0800 CST
一个数字时钟的HTML
2024-11-19 07:46:53 +0800 CST
Vue 中如何处理父子组件通信?
2024-11-17 04:35:13 +0800 CST
markdown语法
2024-11-18 18:38:43 +0800 CST
初学者的 Rust Web 开发指南
2024-11-18 10:51:35 +0800 CST
Vue3 组件间通信的多种方式
2024-11-19 02:57:47 +0800 CST
XSS攻击是什么?
2024-11-19 02:10:07 +0800 CST
免费常用API接口分享
2024-11-19 09:25:07 +0800 CST
程序员茄子在线接单