Lightning Fast Shortener
Shorten, Share & Track with 67er.link
Convert long messy URLs into compact 5-character links. Fast, case-insensitive redirection and real-time click tracking.
Link Shortened Successfully!
Direct Code Redirect
Have a 5-character code? Enter it below to redirect (Case-Insensitive).
Your Shortened Links
Manage all URLs created under your account
Total Links: 0
Total Clicks: 0
| Short Link | Destination URL | Clicks | Created | Actions |
|---|
Admin Control Panel
System AdminGlobal overview of all registered accounts, user links, and guest URLs
0
Registered Users
0
Total System Links
0
Guest Created Links
Registered Users & Generated Links
| User | Role | Created Links Count | Joined Date |
|---|
All System Links (Users & Guests)
| Short Code | Original URL | Owner | Clicks | Action |
|---|
Production REST API & Database Setup
Deploy api.php and .env to your server. Frontend interactions communicate exclusively through secure JSON endpoints.
Inspect Element Protected
Database credentials and SQL logic are 100% server-side in
api.php. Inspecting client code only reveals generic REST calls.
Endpoint: /api.php?action=...
.env (Server Environment Credentials)
DB_HOST=localhost DB_NAME=67erlink.link DB_USER=67erlink.link DB_PASS=jejdj765$+$HeHD
.htaccess (Apache URL Rewriter - Safe Module Guard)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Skip existing static files and directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Route any 5-character short code (e.g. /dbj5b) directly to api.php for redirection
RewriteRule ^([a-zA-Z0-9]{5})$ api.php?action=lookup&redirect=1&code=$1 [L,QSA]
</IfModule>
schema.sql
CREATE DATABASE IF NOT EXISTS `67erlink.link` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `67erlink.link`;
-- Users Table (Bcrypt password hashes)
CREATE TABLE IF NOT EXISTS `users` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(50) UNIQUE NOT NULL,
`email` VARCHAR(100) UNIQUE NOT NULL,
`password_hash` VARCHAR(255) NOT NULL,
`role` ENUM('user', 'admin') DEFAULT 'user',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Links Table (Case-insensitive 5-char codes)
CREATE TABLE IF NOT EXISTS `links` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`short_code` VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci UNIQUE NOT NULL,
`original_url` TEXT NOT NULL,
`user_id` INT NULL,
`clicks` INT DEFAULT 0,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
api.php (Production REST API & Auto-Table Initializer)
<?php
session_start();
header("Content-Type: application/json; charset=UTF-8");
header("X-Content-Type-Options: nosniff");
header("X-Frame-Options: DENY");
// Native .env file parser
if (file_exists(__DIR__ . '/.env')) {
$lines = file(__DIR__ . '/.env', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (strpos(trim($line), '#') === 0) continue;
if (strpos($line, '=') !== false) {
list($name, $value) = explode('=', $line, 2);
putenv(trim($name) . "=" . trim($value));
}
}
}
// Environment Loader with Exact Credentials Fallback
$host = getenv('DB_HOST') ?: 'localhost';
$dbname = getenv('DB_NAME') ?: '67erlink.link';
$user = getenv('DB_USER') ?: '67erlink.link';
$pass = getenv('DB_PASS') ?: 'jejdj765$+$HeHD';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
// Auto-create database tables if they do not exist
$pdo->exec("CREATE TABLE IF NOT EXISTS `users` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(50) UNIQUE NOT NULL,
`email` VARCHAR(100) UNIQUE NOT NULL,
`password_hash` VARCHAR(255) NOT NULL,
`role` ENUM('user', 'admin') DEFAULT 'user',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
$pdo->exec("CREATE TABLE IF NOT EXISTS `links` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`short_code` VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci UNIQUE NOT NULL,
`original_url` TEXT NOT NULL,
`user_id` INT NULL,
`clicks` INT DEFAULT 0,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(["success" => false, "error" => "Database Connection Failed: " . $e->getMessage()]);
exit;
}
$action = $_GET['action'] ?? '';
$input = json_decode(file_get_contents('php://input'), true) ?? [];
// REST Actions
switch ($action) {
case 'shorten':
$url = filter_var($input['url'] ?? '', FILTER_VALIDATE_URL);
if (!$url) {
echo json_encode(["success" => false, "message" => "Invalid URL"]);
exit;
}
$code = substr(md5(uniqid(mt_rand(), true)), 0, 5);
$userId = $_SESSION['user_id'] ?? null;
$stmt = $pdo->prepare("INSERT INTO links (short_code, original_url, user_id) VALUES (?, ?, ?)");
$stmt->execute([$code, $url, $userId]);
echo json_encode(["success" => true, "code" => $code]);
break;
case 'lookup':
$code = trim($input['code'] ?? $_GET['code'] ?? '');
$stmt = $pdo->prepare("SELECT id, original_url FROM links WHERE LOWER(short_code) = LOWER(?)");
$stmt->execute([$code]);
$link = $stmt->fetch();
if ($link) {
$pdo->prepare("UPDATE links SET clicks = clicks + 1 WHERE id = ?")->execute([$link['id']]);
// Perform direct HTTP 302 redirect if accessed via browser bar directly
if (isset($_GET['redirect'])) {
header("Location: " . $link['original_url'], true, 302);
exit;
}
echo json_encode(["success" => true, "url" => $link['original_url']]);
} else {
if (isset($_GET['redirect'])) {
header("Location: /?error=404&code=" . urlencode($code));
exit;
}
echo json_encode(["success" => false, "message" => "URL not found"]);
}
break;
case 'register':
$username = trim($input['username'] ?? '');
$email = trim($input['email'] ?? '');
$password = password_hash($input['password'] ?? '', PASSWORD_BCRYPT);
$count = $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn();
$role = ($count == 0) ? 'admin' : 'user';
try {
$stmt = $pdo->prepare("INSERT INTO users (username, email, password_hash, role) VALUES (?, ?, ?, ?)");
$stmt->execute([$username, $email, $password, $role]);
$_SESSION['user_id'] = $pdo->lastInsertId();
$_SESSION['role'] = $role;
echo json_encode(["success" => true, "user" => ["id" => $_SESSION['user_id'], "username" => $username, "role" => $role]]);
} catch (PDOException $e) {
echo json_encode(["success" => false, "message" => "Username/Email already exists"]);
}
break;
case 'login':
$username = trim($input['username'] ?? '');
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$u = $stmt->fetch();
if ($u && password_verify($input['password'] ?? '', $u['password_hash'])) {
$_SESSION['user_id'] = $u['id'];
$_SESSION['role'] = $u['role'];
echo json_encode(["success" => true, "user" => ["id" => $u['id'], "username" => $u['username'], "role" => $u['role']]]);
} else {
echo json_encode(["success" => false, "message" => "Invalid credentials"]);
}
break;
case 'my_links':
if (!isset($_SESSION['user_id'])) { echo json_encode([]); exit; }
$stmt = $pdo->prepare("SELECT * FROM links WHERE user_id = ? ORDER BY created_at DESC");
$stmt->execute([$_SESSION['user_id']]);
echo json_encode($stmt->fetchAll());
break;
default:
http_response_code(400);
echo json_encode(["error" => "Invalid API Action"]);
}
?>