Chuyện gì đang xảy ra
Bạn mở yourdomain.com/wp-login.php, nhập đúng thông tin đăng nhập, nhưng thay vì vào được trang quản trị thì lại nhận được thông báo:
ERROR: Cookies are blocked or not supported by your browser. You must enable cookies to use WordPress.
Chín trong mười trường hợp, trình duyệt của bạn hoàn toàn bình thường. Thông báo lỗi này gây hiểu nhầm. Thủ phạm thực sự là sự không khớp URL — WordPress nghĩ nó đang chạy ở một địa chỉ trong khi trình duyệt của bạn lại truy cập vào địa chỉ khác. Cookie đăng nhập bị gán cho sai domain và bị loại bỏ ngay lập tức.
Nguyên nhân gốc rễ (xếp theo tần suất)
- URL không khớp trong cơ sở dữ liệu — tùy chọn
siteurlhoặchometrongwp_optionstrỏ đến scheme hoặc subdomain khác (ví dụ: lưu làhttp://nhưng bạn đang truy cập quahttps://, hoặcwww.so với domain không có www). COOKIE_DOMAINsai trong wp-config.php — một hằng số cũ hoặc không chính xác ghi đè phạm vi cookie.- Reverse proxy / CDN không chuyển tiếp đúng header host — WordPress nhận được hostname khác với trình duyệt.
- Plugin cache hoặc bảo mật bên thứ ba xóa header
Set-Cookie. - Trình duyệt thực sự chặn cookie — hiếm gặp, nhưng là trường hợp nhanh nhất để loại trừ.
Bước 1 — Loại trừ vấn đề trình duyệt trong 60 giây
Mở cửa sổ riêng tư/ẩn danh (Ctrl+Shift+N trên Chrome/Edge, Ctrl+Shift+P trên Firefox). Đăng nhập từ đó. Nếu thành công thì vấn đề nằm ở cấp độ trình duyệt: một tiện ích mở rộng lỗi hoặc cài đặt cookie quá chặt. Xóa dữ liệu trang web cho domain của bạn:
- Chrome: DevTools → Application → Storage → Clear site data.
- Firefox: DevTools → Storage → Cookies → nhấp chuột phải vào domain → Delete All.
Chế độ ẩn danh cũng thất bại? Vấn đề nằm ở phía máy chủ. Tiếp tục Bước 2.
Bước 2 — Kiểm tra siteurl và home trong cơ sở dữ liệu
Chạy lệnh này trong phpMyAdmin hoặc qua WP-CLI:
# WP-CLI (nhanh nhất)
wp option get siteurl
wp option get home
Cả hai giá trị phải khớp chính xác với những gì hiển thị trên thanh địa chỉ trình duyệt — cùng scheme (https hay http), cùng subdomain (www hay không có). Chỉ cần sai một ký tự là cookie sẽ bị hỏng. Sửa sự không khớp bằng lệnh:
wp option update siteurl 'https://yourdomain.com'
wp option update home 'https://yourdomain.com'
Không vào được wp-admin? Ghi đè tạm thời các giá trị trong wp-config.php:
define( 'WP_SITEURL', 'https://yourdomain.com' );
define( 'WP_HOME', 'https://yourdomain.com' );
Lưu file và thử đăng nhập lại.
Bước 3 — Xóa hoặc sửa COOKIE_DOMAIN trong wp-config.php
Tìm kiếm trong wp-config.php bất kỳ hằng số nào sau đây:
grep -E 'COOKIE_DOMAIN|COOKIEPATH|SITECOOKIEPATH' /var/www/html/wp-config.php
Tìm thấy COOKIE_DOMAIN trỏ đến domain cũ? Hãy comment nó lại:
// define( 'COOKIE_DOMAIN', 'old-domain.com' ); // ← comment dòng này lại
WordPress tự động xác định domain cookie từ siteurl. Bạn chỉ cần COOKIE_DOMAIN trên các cài đặt multisite chia sẻ cookie giữa các subdomain:
// Với single site — không cần đặt COOKIE_DOMAIN.
// Với multisite chia sẻ cookie trên *.yourdomain.com:
define( 'COOKIE_DOMAIN', '.yourdomain.com' ); // lưu ý dấu chấm ở đầu
Bước 4 — Kiểm tra sự không khớp http/https phía sau proxy
Đây là trường hợp tinh tế. Máy chủ của bạn bắt buộc dùng HTTPS, nhưng siteurl của WordPress vẫn là http://. Load balancer kết thúc SSL trước khi PHP nhận được request. $_SERVER['HTTPS'] của PHP trả về rỗng, khiến WordPress bỏ qua cờ Secure trên cookie — hoặc gán cookie cho sai domain.
Thêm đoạn này vào wp-config.php để khắc phục:
// Báo cho WordPress biết HTTPS đang hoạt động dù PHP thấy HTTP
if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) {
$_SERVER['HTTPS'] = 'on';
}
Trên Nginx, đảm bảo block upstream thực sự truyền header đó:
proxy_set_header X-Forwarded-Proto $scheme;
Bước 5 — Vô hiệu hóa plugin qua hệ thống file
Vẫn bị kẹt? Một plugin bảo mật hoặc cache có thể đang xóa header Set-Cookie. Các thủ phạm phổ biến: Wordfence, WP Super Cache, W3 Total Cache, Cloudflare APO. Vô hiệu hóa tất cả cùng lúc mà không cần vào wp-admin:
# Đổi tên thư mục plugins để vô hiệu hóa tất cả cùng lúc
mv /var/www/html/wp-content/plugins /var/www/html/wp-content/plugins_disabled
Thử đăng nhập. Thành công? Đổi tên thư mục lại, rồi kích hoạt từng plugin một để tìm thủ phạm:
mv /var/www/html/wp-content/plugins_disabled /var/www/html/wp-content/plugins
Sau khi tìm ra plugin lỗi, tìm các cài đặt như "Cache logged-in users" hoặc "Remove cookies for anonymous users" và tắt chúng đi.
Bước 6 — Xác minh cookie có thực sự được thiết lập không
Mở DevTools (F12) → tab Network → gửi form đăng nhập → nhấp vào request POST wp-login.php → kiểm tra Response Headers. Bạn sẽ thấy nội dung như sau:
Set-Cookie: wordpress_sec_... ; path=/wp-content/plugins; secure; HttpOnly
Set-Cookie: wordpress_logged_in_... ; path=/; secure; HttpOnly
Header xuất hiện với đúng domain và path? WordPress đang hoạt động đúng — vấn đề nằm ở phía client (chính sách trình duyệt, tiện ích mở rộng, hoặc iframe). Hoàn toàn không có Set-Cookie? Proxy hoặc tầng cache của bạn đang xóa nó.
Với Nginx, thêm block riêng cho trang đăng nhập để bỏ qua cache hoàn toàn:
location = /wp-login.php {
fastcgi_cache_bypass 1;
fastcgi_no_cache 1;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
Xác minh
- Xóa toàn bộ cookie trình duyệt cho domain của bạn.
- Truy cập
https://yourdomain.com/wp-login.php. - Nhập thông tin đăng nhập — bạn sẽ được chuyển đến
/wp-admin/mà không có thông báo lỗi. - Xác nhận bằng WP-CLI:
wp option get siteurlphải trả về đúng URL bạn vừa đăng nhập. - Trong DevTools → Application → Cookies, xác nhận
wordpress_logged_in_*tồn tại với đúng domain và cờSecuređược bật.
Tham khảo nhanh — cách sửa phổ biến theo triệu chứng
- Đăng nhập được trong chế độ ẩn danh, thất bại ở trình duyệt thường → xóa cookie/cache, kiểm tra tiện ích mở rộng.
- Thất bại trên cả phiên bản http:// lẫn https:// → URL không khớp trong wp_options (Bước 2).
- Xảy ra sau khi chuyển sang host mới hoặc thêm SSL →
COOKIE_DOMAINkhông khớp hoặc thiếu X-Forwarded-Proto (Bước 3–4). - Xảy ra sau khi cài plugin → xung đột plugin (Bước 5).
- Không có header Set-Cookie trong DevTools → proxy/cache đang xóa cookie (Bước 6).

