301 vs 302 vs 307 vs 308: Nên Dùng Redirect Nào
Chọn sai loại redirect có thể khiến URL cũ nằm trên Google nhiều tháng, hoặc biến việc gửi form thành một GET request làm mất dữ liệu. Dưới đây là ý nghĩa của từng mã trạng thái, nên dùng mã nào, và cách kiểm tra redirect của bạn có hoạt động đúng không.
Tổng quan 4 loại redirect
| Mã trạng thái | Vĩnh viễn? | Giữ nguyên method và body? | Dùng cho |
|---|---|---|---|
301 Moved Permanently | Có | Không đảm bảo (POST có thể đổi thành GET) | Trang đã chuyển, HTTP → HTTPS, đổi tên miền |
302 Found | Không | Không đảm bảo | Chuyển tạm thời ngắn hạn, A/B test, bảo trì |
307 Temporary Redirect | Không | Có | Chuyển tạm thời các API endpoint và form |
308 Permanent Redirect | Có | Có | Chuyển vĩnh viễn các API endpoint nhận POST |
Về SEO, Google coi 301 và 308 là tín hiệu mạnh cho thấy URL mới nên thay thế URL cũ, và chuyển tín hiệu xếp hạng sang URL mới. Ngược lại, 302 và 307 báo cho Google giữ URL cũ trong chỉ mục. Chi tiết đầy đủ về từng mã có trong trang HTTP Status Codes.
Nên chọn loại nào
- Trang đã chuyển hẳn (đổi slug, gộp bài viết, đổi tên miền) → 301.
- HTTP sang HTTPS, www sang non-www → 301 (hoặc 308).
- Tạm thời (trang khuyến mãi, bảo trì, điều hướng theo vị trí hoặc ngôn ngữ) → 302.
- API endpoint hoặc form handler đã chuyển → 308 (vĩnh viễn) hoặc 307 (tạm thời), để dữ liệu POST không bị mất.
Tránh chuỗi và vòng lặp
Chuỗi là /a → /b → /c: mỗi bước tốn thêm một lượt đi về, và crawler có thể ngừng theo dõi sau vài bước. Vòng lặp (/a → /b → /a) làm trang không thể truy cập. Sau khi migrate, hãy trỏ mọi URL cũ thẳng đến đích cuối cùng. Kiểm tra toàn bộ đường đi của bất kỳ URL nào, gồm từng bước, mã trạng thái và thời gian, bằng Redirect Checker, và xem các phiên bản http, https, www và non-www có cùng kết thúc ở một nơi không.
Quy tắc copy-paste
Apache (.htaccess):
Redirect 301 /old-page /new-page
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Nginx:
location = /old-page { return 301 /new-page; }
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
Vercel (vercel.json): "permanent": true sẽ trả về 308, và Google xử lý giống 301.
{ "redirects": [ { "source": "/old-page", "destination": "/new-page", "permanent": true } ] }
Nếu bạn có một bảng tính gồm danh sách URL cũ → mới, hãy chuyển nó thành rule cho bất kỳ server nào bằng Redirect Generator, hoặc tạo file cấu hình Apache đầy đủ bằng .htaccess Generator.
Checklist khi migrate
- Ánh xạ mọi URL cũ sang URL mới phù hợp nhất, đừng chuyển hết về trang chủ vì Google coi đó là soft 404.
- Dùng 301 (hoặc 308) cho chuyển hướng vĩnh viễn và giữ chúng ít nhất một năm.
- Cập nhật liên kết nội bộ và sitemap sang URL mới, để redirect chỉ còn là lưới an toàn.
- Thử một số URL cũ, sau đó theo dõi báo cáo Pages trong Search Console để tìm lỗi 404.