¿Alguna vez quisiste saber cuántos usuarios hacen clic en un enlace que compartes? ¿O esconder la URL real de tus enlaces de afiliado o campañas? En este artículo, te mostraré cómo crear tu propio sistema de redirección con estadísticas, completamente personalizado en PHP y MySQL.
✨ ¿Qué es un sistema de redirección con estadísticas?
Es una herramienta que:
- Redirige a los usuarios a un enlace final (por ejemplo, un producto).
- Registra información sobre el clic: IP, navegador, origen, fecha, etc.
- Te permite crear URLs limpias como
https://tusitio.com/go/oferta
.
🧱 1. Estructura básica de la base de datos
Tabla go
: almacena los enlaces
CREATE TABLE go (
id INT AUTO_INCREMENT PRIMARY KEY,
slug VARCHAR(255) UNIQUE,
real_url TEXT,
clicks INT DEFAULT 0,
created_at DATETIME,
last_click_at DATETIME,
`order_by` INT NOT NULL DEFAULT 1,
`status` TINYINT(1) NOT NULL DEFAULT 1
);
Tabla go_clicks
: almacena cada clic
CREATE TABLE go_clicks (
id INT AUTO_INCREMENT PRIMARY KEY,
go_id INT,
clicked_at DATETIME,
ip VARCHAR(45),
user_agent TEXT,
referrer TEXT,
`order_by` INT NOT NULL DEFAULT 1,
`status` TINYINT(1) NOT NULL DEFAULT 1,
FOREIGN KEY (go_id) REFERENCES go(id)
);
⚙️ 2. Código PHP para procesar el enlace (go.php
)
Este archivo recibe el parámetro ?s=slug
o ?i=id
, registra el clic, y redirige:
<?php
require_once 'admin/conect_db.php';
$slug = $_GET['s'] ?? null;
$id = $_GET['i'] ?? null;
if (!$slug && !$id) {
http_response_code(400);
exit('Enlace inválido');
}
if ($slug) {
$stmt = $db->prepare("SELECT * FROM go WHERE slug = ? AND status = 1 LIMIT 1");
$stmt->execute([$slug]);
} else {
$stmt = $db->prepare("SELECT * FROM go WHERE id = ? AND status = 1 LIMIT 1");
$stmt->execute([$id]);
}
$go = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$go) {
http_response_code(404);
exit('Enlace no encontrado o desactivado');
}
// Insertar clic
$click_sql = "INSERT INTO go_clicks (go_id, clicked_at, ip, user_agent, referrer, order_by, status)
VALUES (?, NOW(), ?, ?, ?, 1, 1)";
$click_stmt = $db->prepare($click_sql);
$click_stmt->execute([
$go['id'],
$_SERVER['REMOTE_ADDR'],
$_SERVER['HTTP_USER_AGENT'],
$_SERVER['HTTP_REFERER'] ?? ''
]);
// Actualizar contador
$db->prepare("UPDATE go SET clicks = clicks + 1, last_click_at = NOW() WHERE id = ?")
->execute([$go['id']]);
header('Location: ' . $go['real_url']);
exit;
?>
🧼 3. URLs limpias con .htaccess
Para permitir URLs como https://tusitio.com/go/nombre-del-enlace
, crea un archivo .htaccess
:
RewriteEngine On
# Acceso por slug: /go/mi-enlace → go.php?s=mi-enlace
RewriteRule ^go/([a-zA-Z0-9\-_]+)/?$ go.php?s=$1 [L,QSA]
# Acceso por ID: /go/id/123 → go.php?i=123
RewriteRule ^go/id/([0-9]+)/?$ go.php?i=$1 [L,QSA]
👁️ 4. Crear un enlace desde el panel de administración
Inserta un nuevo enlace manualmente o desde un formulario:
INSERT INTO go (slug, real_url, created_at)
VALUES ('oferta-verano', 'https://afiliado.com/producto123', NOW());
Ahora puedes compartir:
https://tusitio.com/go/oferta-verano
📊 5. Ver las estadísticas
Puedes mostrar estadísticas básicas como esta:
<?php
$sql = "SELECT g.slug, g.real_url, g.clicks, MAX(gc.clicked_at) AS last_click
FROM go g
LEFT JOIN go_clicks gc ON gc.go_id = g.id
GROUP BY g.id
ORDER BY g.created_at DESC";
$stmt = $db->query($sql);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<table>
<tr><th>Slug</th><th>Clicks</th><th>Último clic</th></tr>
<?php foreach ($results as $row): ?>
<tr>
<td><?= htmlspecialchars($row['slug']) ?></td>
<td><?= $row['clicks'] ?></td>
<td><?= $row['last_click'] ?></td>
</tr>
<?php endforeach; ?>
</table>
🔐 Consejos de seguridad
- Usa
htmlspecialchars()
para mostrar datos. - Valida que los slugs o IDs existan.
- Si quieres ocultar aún más la URL, usa códigos generados con
uniqid()
o UUIDs. - Limita quién puede crear enlaces.
✅ Ventajas de este sistema
- Ocultas los enlaces reales (ideal para afiliados).
- Tomas control total de las estadísticas.
- Puedes integrarlo fácilmente con WordPress, Laravel o cualquier otro sistema.
🧪 Posibles mejoras futuras
- Filtros por fecha.
- Exportación de datos.
- Geolocalización por IP.
- Protección contra bots.
- QR codes.
🏁 Conclusión
Tener tu propio sistema de redirección y estadísticas no solo te da control, sino que también protege tus campañas y te ofrece datos valiosos. Además, con unas pocas líneas de código y una base de datos sencilla, puedes montar una solución profesional y escalable.
¿Te gustó este tutorial? ¡Déjame tus preguntas en los comentarios o contáctame si quieres que te lo integre en tu sitio!