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

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

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

推荐文章

Vue3 结合 Driver.js 实现新手指引
2024-11-18 19:30:14 +0800 CST
JavaScript设计模式:观察者模式
2024-11-19 05:37:50 +0800 CST
Nginx负载均衡详解
2024-11-17 07:43:48 +0800 CST
GROMACS:一个美轮美奂的C++库
2024-11-18 19:43:29 +0800 CST
解决python “No module named pip”
2024-11-18 11:49:18 +0800 CST
js迭代器
2024-11-19 07:49:47 +0800 CST
一个有趣的进度条
2024-11-19 09:56:04 +0800 CST
PyMySQL - Python中非常有用的库
2024-11-18 14:43:28 +0800 CST
Vue3中的Store模式有哪些改进?
2024-11-18 11:47:53 +0800 CST
PostgreSQL日常运维命令总结分享
2024-11-18 06:58:22 +0800 CST
百度开源压测工具 dperf
2024-11-18 16:50:58 +0800 CST
Vue3 组件间通信的多种方式
2024-11-19 02:57:47 +0800 CST
程序员茄子在线接单