PHP教程:如何用PHP来做一个短网址(短链接)服务?
一、什么是短链接(短网址)?
短链接(Short URL)是一种简短的URL,用来映射更长的URL地址。当用户访问短链接时,短链接服务会将用户重定向到对应的长URL。这种服务还可以记录访问数据,如访问次数、来源等。
二、短链接(短网址)的优点
- 易记:简短的链接更容易记忆。
- 便于分享:适合在短信、社交媒体中分享。
- 易输入:移动设备上更方便输入。
- 跟踪:可以提供访问跟踪和分析功能。
- 安全:降低微信、QQ等的封锁风险。
- 简化二维码:缩短后的网址生成的二维码更容易扫描。
- 降低权重传递:防止权重传递给其他站点,有利于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的伪静态规则。你可以根据需要扩展功能,例如添加访问统计、分析、用户登录等。通过这种服务,能够大大简化链接的分享和管理,提高用户体验。