Bạn đã trả phòng khách sạn, đã thanh toán đầy đủ. Thong thả đi ra ngoài để đợi xe tới đón, bỗng nhiên cô nhân viên Lễ tân hớt hải chạy ra: Anh ơi, anh chưa làm thủ tục trả phòng! Tình huống thật là trớ trêu!
Bạn đang trên đà leo lên "đỉnh cao" lập trình. Bạn làm chức năng Login.
Bạn làm luôn chức năng Logout.
Test thử:
- Login thành công
- Dashboard hiện ra
- Logout thành công
- Quay về login page
Bạn thở phào nhẹ nhõm, tự thưởng một ly cà phê thơm phức.
Sau đó bấm:
Back
Và...
Dashboard xuất hiện.
Bạn bắt đầu..."quê độ" và hoang mang:
"Session chưa bị xóa à?"
"Logout thất bại?"
"PHP phản chủ?"
Logout rồi nhưng Browser Back vẫn vào được là gì?
Đây là hiện tượng:
- User đã logout
- Session đã bị hủy
Nhưng bấm nút Back của trình duyệt vẫn thấy trang cũ
Nguyên nhân thường không nằm ở:
- Session
- MySQL
- Hosting
Mà nằm ở: Cache trình duyệt
Ví dụ trớt quớt
Bạn login:
admin
123456
Dashboard hiện ra rất "hoành văn tráng":
Xin chào admin, chúc một ngày mới vui vẻ!
Bạn logout.
PHP:
session_destroy();
Mọi thứ có vẻ ổn.
Nhưng:
Back
Dashboard hiện lại.
Lính mới...théc méc:
"Session_destroy() bị lỗi?"
Không hẳn
Ví dụ thực tế
Hãy tưởng tượng:
- Bạn đã trả phòng khách sạn.
- Đã giao chìa khóa.
- Đã check-out.
Nhưng bạn mở album ảnh điện thoại.
Vẫn thấy ảnh căn phòng.
Điều đó không có nghĩa:
Bạn vẫn thuê phòng
Dashboard hiện lại sau khi Back cũng tương tự.
Nó có thể chỉ là:
Ảnh chụp cũ
do trình duyệt lưu cache.
Nguyên nhân phổ biến nhất
Browser Cache
Đây là thủ phạm số 1.
Khi bạn truy cập:
dashboard.php
trình duyệt có thể lưu lại nội dung.
Sau khi logout:
Back
Browser không tải lại server.
Nó lấy bản cache.
Dấu hiệu nhận biết
Dashboard hiện ra.
Nhưng:
F5
thì bị đá về login.
Nếu như vậy:
- Session hoạt động bình thường.
- Cache mới là thủ phạm.
Cách kiểm tra
Dashboard hiện.
Bấm:
Ctrl + F5
Nếu bị chuyển về:
login.php
thì gần như chắc chắn là cache.
Một hiểu lầm phổ biến
Lính mới nghĩ:
session_destroy();
sẽ xóa tất cả mọi thứ.
Không hề. Nó chỉ xóa:
Session
Không xóa:
Cache trình duyệt
Logout đúng cách
logout.php
<?php
session_start();
session_unset();
session_destroy();
header("Location: login.php");
exit;
?>Đây là bước đầu tiên.
Nhưng vẫn chưa đủ
Nếu dashboard được cache.
Back vẫn có thể hiện nội dung cũ.
Cách xử lý chuyên nghiệp
Thêm vào đầu dashboard.php
<?php
session_start();
header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");
?>Điều này nói với browser:
"Đừng lưu trang này."
Bảo vệ Dashboard đúng cách
dashboard.php
<?php
session_start();
if(!isset($_SESSION['user']))
{
header("Location: login.php");
exit;
}
?>Đây mới là lớp bảo vệ quan trọng nhất.
Cho dù:
Back
Hay:
Nhập URL trực tiếp
Hay:
Bookmark
Nếu Session không tồn tại:
Không được vào Dashboard.
Tập tành làm web
Trong quá trình "vọc" trên InfinityFree.
Nhiều bạn có "niềm tin sắt đá":
"Host miễn phí làm lỗi logout."
Thực tế:
80% trường hợp là:
Cache trình duyệt
Không phải hosting.
Sự thật...biết rồi, khổ lắm, nói mãi
Bạn thử:
- Gmail
- Shopee
Login.
Logout.
Back.
Rất nhiều trường hợp:
Trang cũ vẫn lóe lên vài mili giây.
Sau đó:
Redirect Login
Đó là vì:
Cache và Session là hai thứ khác nhau.
Debug kiểu dev "xịn sò"
1. Kiểm tra Session
Dashboard:
var_dump($_SESSION);
2. Thử F5
Nếu F5 đá về Login.
Session đang hoạt động.
3. Mở tab ẩn danh
Test lại.
4. Thử Ctrl + F5
Xóa cache tạm thời.
Checklist chuẩn không cần chỉnh
- Có session_start()
- Có session_unset()
- Có session_destroy()
- Có header redirect
- Dashboard kiểm tra Session
- Có no-cache header
- Đã test bằng F5
- Đã test bằng tab ẩn danh
FAQ nhanh
Logout rồi Back thấy dashboard có phải lỗi không?
Có thể không. Thường là cache.
session_destroy() có đủ không?
Chưa chắc. Nên kết hợp kiểm tra Session ở dashboard.
InfinityFree có gây lỗi này không?
Thường không. Đa số do cache trình duyệt.
Có cần dùng Cache-Control không?
Nên dùng cho các trang quản trị.
Bạn có thể cũng đang gặp
Login thành công nhưng quay lại vẫn vào được Login Page
Remember Me hoạt động thế nào?
Redirect sau submit form đúng cách
Login đúng password nhưng vẫn fail