Tình huống xảy ra
Lúc 2 giờ sáng. Ai đó vừa chuyển site sang HTTPS, đổi domain, hoặc chỉnh một rule trong .htaccess. Giờ mọi lần truy cập /wp-login.php hay /wp-admin đều kết thúc như nhau:
ERR_TOO_MANY_REDIRECTS — This page isn't redirecting properly when accessing /wp-login.php or /wp-admin
Trình duyệt bắn ra hơn 20 request redirect, phát hiện vòng lặp rồi bỏ cuộc. Bạn bị khóa ngoài. Người dùng thường có bị ảnh hưởng hay không còn tùy vào chỗ nào khởi phát vòng lặp. Hãy xử lý từng bước từ nhanh nhất đến triệt để nhất.
Nguyên nhân
WordPress thực hiện redirect khi siteurl hoặc home trong database không khớp với URL mà server đang thực sự phục vụ. Sự không đồng bộ này tạo ra một vòng phản hồi mà WordPress không thoát ra được.
Những nguyên nhân phổ biến nhất:
- Chuyển HTTP → HTTPS mà không cập nhật
wp-config.phphoặc database - Đổi domain nhưng chỉ cập nhật một phần các cài đặt
- Hằng số
WP_SITEURLhoặcWP_HOMEbị hardcode sai trongwp-config.php - Plugin cache hoặc CDN (Cloudflare, Nginx FastCGI) chặn redirect khi đăng nhập
- Cookie xác thực WordPress cũ bị server từ chối — server tiếp tục redirect để xác thực lại, cookie lại bị từ chối, cứ thế lặp
- Reverse proxy loại bỏ header
HTTPSkhiến WordPress nghĩ request là HTTP thuần trong khi trình duyệt đã ở HTTPS
Sửa nhanh: ghi đè siteurl và home trong wp-config.php
Đây là cách kiểm tra nhanh nhất. Mở wp-config.php và thêm hai dòng này trước comment /* That's all, stop editing! */:
define('WP_HOME', 'https://yourdomain.com');
define('WP_SITEURL', 'https://yourdomain.com');
Các hằng số này có độ ưu tiên cao hơn bất kỳ giá trị nào trong database. Tải lại /wp-login.php — nếu vòng lặp dừng lại, nghĩa là database đang chứa URL sai và đó là nguyên nhân gốc rễ.
Sau khi vào được, vào Settings → General và kiểm tra lại WordPress Address lẫn Site Address đã đúng chưa. Sau đó bạn có thể xóa các hằng số hardcode khỏi wp-config.php nếu muốn để database làm nguồn chính.
Sửa trực tiếp trong database (khi ghi đè wp-config.php không ăn thua)
Kết nối qua phpMyAdmin hoặc vào MySQL trực tiếp:
mysql -u db_user -p db_name
Kiểm tra giá trị thực sự đang lưu:
SELECT option_name, option_value
FROM wp_options
WHERE option_name IN ('siteurl', 'home');
Vừa migrate từ HTTP sang HTTPS? Rất có thể bạn vẫn thấy http://yourdomain.com ở đó. Sửa lại:
UPDATE wp_options SET option_value = 'https://yourdomain.com' WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value = 'https://yourdomain.com' WHERE option_name = 'home';
Không có phpMyAdmin nhưng có WP-CLI? Hai lệnh sau làm điều tương tự:
wp option update siteurl 'https://yourdomain.com'
wp option update home 'https://yourdomain.com'
Xóa cookie và cache trình duyệt
Trước khi đào sâu vào các sửa lỗi phía server, hãy loại trừ khả năng do cookie cũ. Cookie gây ra vòng lặp redirect nhiều hơn người ta nghĩ.
- Mở cửa sổ ẩn danh/riêng tư và thử truy cập thẳng
/wp-login.php - Hoặc xóa cookie của domain: DevTools → Application → Cookies → chuột phải → Clear
- Thử một trình duyệt hoàn toàn khác để kiểm chứng
Nếu trình duyệt sạch load được trang đăng nhập, cookie chính là thủ phạm. Không cần thay đổi gì ở server — chỉ cần đăng nhập từ phiên sạch đó.
Sửa .htaccess (Apache)
Chỉ một rule redirect sai trong .htaccess là đủ để tạo vòng lặp. Cách xác nhận nhanh nhất: tạm thời đẩy file đó ra chỗ khác.
mv /var/www/html/.htaccess /var/www/html/.htaccess.bak
Thử lại /wp-login.php. Vào được không? Nghĩa là .htaccess có rule lỗi. Tạo lại file mặc định của WordPress từ Settings → Permalinks → Save Changes, hoặc dán thủ công nội dung sau:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Sửa lỗi HTTPS đằng sau reverse proxy (stack Nginx + Apache)
Đang chạy WordPress đằng sau load balancer hoặc Nginx reverse proxy? Rất có thể tiến trình PHP nhận thấy HTTP trong khi trình duyệt đang ở HTTPS. WordPress redirect sang HTTPS. Nginx proxy request trở lại dưới dạng HTTP. WordPress lại redirect. Vòng lặp cứ chạy cho đến khi trình duyệt bỏ cuộc — thường sau 20 bước nhảy.
Thêm đoạn này vào wp-config.php:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
Sau đó kiểm tra config Nginx có thực sự forward header không:
proxy_set_header X-Forwarded-Proto $scheme;
Kiểm tra cấu hình và reload:
sudo nginx -t && sudo systemctl reload nginx
Sửa vòng lặp SSL với Cloudflare
Chế độ SSL Flexible của Cloudflare có lẽ là nguyên nhân phổ biến nhất gây redirect loop trên WordPress sau khi migrate CDN. Cơ chế như sau: Flexible khiến Cloudflare giao tiếp với origin server bằng HTTP thuần. WordPress phát hiện HTTP, lập tức redirect sang HTTPS. Cloudflare lại proxy về dưới dạng HTTP. WordPress redirect tiếp. Site không bao giờ load được.
Vào Cloudflare Dashboard → SSL/TLS và chuyển chế độ sang Full hoặc Full (Strict). Vòng lặp dừng trong vài giây — không cần purge cache.
Tắt toàn bộ plugin qua filesystem (giải pháp triệt để)
Các plugin redirect, công cụ bảo mật đăng nhập, và một số plugin cache đều có thể tạo ra vòng lặp này. Khi không vào được dashboard để tắt chúng, hãy làm từ filesystem:
mv /var/www/html/wp-content/plugins /var/www/html/wp-content/plugins.bak
Thử /wp-login.php. Nếu load được, có plugin là thủ phạm. Khôi phục thư mục:
mv /var/www/html/wp-content/plugins.bak /var/www/html/wp-content/plugins
Bật lại từng plugin một từ dashboard. Vòng lặp sẽ xuất hiện trở lại khi bạn bật đúng cái xấu — đó là mục tiêu cần tìm.
Xác nhận đã sửa xong
- Mở
https://yourdomain.com/wp-login.phptrong cửa sổ ẩn danh — form đăng nhập phải hiện ra mà không có redirect nào - Kiểm tra DevTools → Network: response cho
/wp-login.phpphải là200 OK, không phải chuỗi301hay302 - Đăng nhập và xác nhận trang admin dashboard load bình thường
- Chạy
wp option get siteurl && wp option get homeđể xác nhận cả hai giá trị trong database đều đúng

