ไอเดีย #13: ระบบ URL Shortener พร้อมสถิติคลิก
เคยไหมครับ จะใส่ลิงก์แบบฟอร์มลงในโปสเตอร์ประชาสัมพันธ์ แต่ลิงก์ยาวเป็นพรืดจนพิมพ์ตามไม่ได้ หรือทำแคมเปญลงหลายช่องทางแล้วไม่รู้เลยว่าคนคลิกมาจากไหน URL Shortener เป็นระบบที่ดูเล็ก แต่ซ่อนโจทย์ดี ๆ ไว้เพียบ ทั้งการสร้างรหัสสั้นไม่ให้ชนกัน การเก็บสถิติคลิกจำนวนมาก และการกันไม่ให้ระบบกลายเป็นเครื่องมือของคนส่งลิงก์หลอกลวง เหมาะกับมือใหม่ที่อยากได้งานที่ใช้ได้จริงในองค์กรหรือชมรม
ใครจะใช้
- ผู้ใช้ทั่วไป — ย่อลิงก์และแชร์ต่อ
- เจ้าของลิงก์ (สมาชิก) — จัดการลิงก์ของตัวเอง และดูสถิติการคลิก
- แอดมิน — ตรวจลิงก์ที่ถูกรายงาน ปิดลิงก์อันตราย และจัดการโดเมนต้องห้าม
ฟีเจอร์ขั้นต่ำ (MVP)
- วางลิงก์ยาวแล้วได้รหัสสั้น 6–8 ตัวอักษร หรือตั้งชื่อเองได้ (custom alias) ถ้ายังไม่มีคนใช้
- redirect ด้วย HTTP 301 หรือ 302 พร้อมบันทึกการคลิกทุกครั้ง
- สถิติคลิก: จำนวนคลิกรายวัน, referrer, ประเภทอุปกรณ์, เบราว์เซอร์ แสดงเป็นกราฟด้วย Chart.js
- สร้าง QR code ของลิงก์สั้นเพื่อเอาไปพิมพ์ลงสื่อ
- กันสแปม: จำกัดจำนวนการสร้างลิงก์ต่อ IP ต่อชั่วโมง, ตรวจโดเมนกับ blocklist และปุ่มรายงานลิงก์อันตราย
- ตั้งวันหมดอายุหรือปิดลิงก์ชั่วคราวได้
ต่อยอดได้อีก
- รองรับ UTM parameter เพื่อแยกแคมเปญ
- ลิงก์ที่ต้องใส่รหัสผ่านก่อนเปิด
- หน้าพรีวิวปลายทางก่อน redirect เพื่อให้ผู้ใช้มั่นใจว่าปลอดภัย
- API สำหรับให้ระบบอื่นสร้างลิงก์สั้นอัตโนมัติ
โครงข้อมูลตั้งต้น
CREATE TABLE links (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NULL,
code VARCHAR(16) UNIQUE NOT NULL,
target_url TEXT NOT NULL,
expires_at TIMESTAMP NULL,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT now()
);
CREATE TABLE clicks (
id BIGSERIAL PRIMARY KEY,
link_id BIGINT REFERENCES links(id),
clicked_at TIMESTAMP DEFAULT now(),
referrer TEXT, device VARCHAR(20), ip_hash CHAR(64)
);
เพิ่มตาราง blocked_domains (domain, reason) และ reports (link_id, reason, status) สำหรับระบบกันสแปม
ระดับความยาก และสิ่งที่จะได้เรียนรู้
ระดับ มือใหม่ ทำได้ด้วย Yii2, Laravel หรือ Node.js + PostgreSQL/MySQL สิ่งที่จะได้เรียนรู้:
- การสร้างรหัสสั้นด้วย base62 หรือสุ่มแล้วเช็กซ้ำผ่าน unique index
- การตั้ง URL routing และเข้าใจความต่างของ 301 กับ 302
- การออกแบบตารางที่โตเร็ว ใส่ index ให้ถูก และสรุปสถิติรายวันด้วย cron
- พื้นฐาน rate limiting และ input validation
ข้อควรระวัง
- ถ้าเปิดให้ใครก็ย่อลิงก์ได้ ระบบจะถูกใช้ส่งลิงก์ phishing อย่างรวดเร็ว ควรมี blocklist และช่องทางรายงาน
- ตรวจ target URL ให้เป็น http/https เท่านั้น กันการใส่
javascript:หรือ scheme แปลก ๆ - IP address ถือเป็นข้อมูลส่วนบุคคลตาม PDPA ควรเก็บแบบ hash และไม่เก็บนานเกินจำเป็น
ใครเคยทำ URL Shortener ใช้งานจริงบ้างครับ ตอนตารางคลิกโตเป็นหลักล้านแถวแก้ปัญหาช้ายังไง ใช้ partition, สรุปรายวัน หรือย้ายไปเก็บใน Redis ก่อน ถ้าลองทำแล้วมาแชร์โค้ดหรือเล่าวิธีกันสแปมในบอร์ดนี้กันได้เลย