Mã Trạng Thái HTTP 302 (302 Found): Ý Nghĩa và Cách Sử Dụng

Advertisement
Mã Trạng Thái HTTP 302 Là Gì?
Mã trạng thái HTTP 302 — chính thức tên là 302 Found — là một mã phản hồi HTTP cho biết với client (thường là trình duyệt) rằng tài nguyên được yêu cầu đã tạm thời được dời sang một URL khác. URL mới được cung cấp trong header Location của phản hồi, và client sẽ lấy tài nguyên từ đó chỉ cho yêu cầu này.
Vì việc dời là tạm thời, client nên tiếp tục dùng URL gốc cho các yêu cầu trong tương lai. Công cụ tìm kiếm, trình duyệt và bookmark không nên thay thế URL gốc bằng đích chuyển hướng. Đây là khác biệt hành vi quan trọng giữa HTTP 302 và 301 Moved Permanently.
Mã 302 thuộc lớp 3xx chuyển hướng của các mã trạng thái HTTP, được định nghĩa trong RFC 9110. Mặc dù tên lịch sử là 'Found', phần thân phản hồi hầu như không bao giờ được sử dụng — các trình duyệt hiện đại đi theo header Location ngay lập tức mà không render nó.
Cấu Trúc Của Phản Hồi 302
Một phản hồi mã trạng thái HTTP 302 luôn chứa hai thành phần thiết yếu: dòng trạng thái và một header Location trỏ tới URL mới. Không có header Location hợp lệ, client không thể đi theo chuyển hướng.
Dòng trạng thái —
HTTP/1.1 302 Found(hoặcHTTP/2 302trong HTTP/2)Header Location — URL đích mà client phải đi theo (bắt buộc)
Cache-Control — thường là
no-cacheđể trình duyệt không cache đích chuyển hướng vĩnh viễnBody — thường rỗng; máy chủ có thể bao gồm trang HTML nhỏ cho client cũ (
<html><body><a href="...">Bấm vào đây</a></body></html>)
HTTP/1.1 302 Found
Location: https://www.example.com/new-page
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Cache-Control: no-cache, no-store
Date: Mon, 27 Apr 2026 14:00:00 GMTHeader Location có thể là URL tuyệt đối (https://example.com/path) hoặc URL tương đối theo path (/path). Các client HTTP hiện đại đều chấp nhận, nhưng URL tuyệt đối được khuyến nghị để rõ ràng.
302 vs 301 vs 307 vs 308: Nên Dùng Loại Nào?
HTTP định nghĩa năm mã chuyển hướng phổ biến, và chọn đúng quan trọng cho cache, SEO và bảo toàn phương thức yêu cầu. Dùng bảng này như ma trận quyết định:
| Mã | Tính bền vững | Bảo toàn phương thức? | Trình duyệt cache? | Tốt nhất cho |
|---|---|---|---|---|
| 301 Moved Permanently | Vĩnh viễn | Có thể đổi POST→GET | Có (mạnh) | Đổi URL vĩnh viễn, di chuyển domain |
| 302 Found | Tạm thời | Thường đổi POST→GET | Không | Luồng login, A/B test, bảo trì |
| 303 See Other | Tạm thời | Luôn đổi sang GET | Không | Mẫu POST/Redirect/GET sau gửi form |
| 307 Temporary Redirect | Tạm thời | Có — bảo toàn | Không | Chuyển hướng tạm cần giữ POST/PUT |
| 308 Permanent Redirect | Vĩnh viễn | Có — bảo toàn | Có | Chuyển hướng vĩnh viễn cần giữ POST/PUT |
Khuyến nghị hiện đại: nếu cần chuyển hướng tạm thời và muốn rõ ràng về xử lý phương thức, dùng 307 thay vì 302. Mã 307 được thêm vào HTTP/1.1 chính vì các trình duyệt trong lịch sử đã vi phạm spec bằng cách đổi POST sang GET trên 302 — và hành vi sai đó phổ biến đến mức trở thành chuẩn de facto.
Khi Nào Nên Dùng Chuyển Hướng 302?
Dùng mã trạng thái HTTP 302 bất cứ khi nào chuyển hướng thực sự tạm thời — nghĩa là bạn dự định bỏ hoặc thay đích chuyển hướng trong tương lai. Các trường hợp dùng hợp lệ phổ biến:
Chuyển hướng login — Đưa người dùng chưa xác thực từ
/dashboardđến/login, sau đó quay lại sau khi đăng nhậpA/B test — Định tuyến 50% người dùng tới biến thể mà không đổi URL canonical
Trang bảo trì — Tạm thời chuyển hướng tất cả lưu lượng tới
/maintenancekhi bạn vá máy chủĐịnh tuyến theo địa lý — Đưa khách từ
/đến/vnhoặc/ustheo quốc gia, giữ/là điểm vào canonicalChuyển hướng mobile — Đưa người dùng smartphone từ
example.comtớim.example.com(hôm nay nên dùng thiết kế responsive)Trang sản phẩm hết hàng — Đưa khách hàng tới trang danh mục cho đến khi sản phẩm có lại
URL khuyến mãi ngắn hạn —
/black-fridaychuyển hướng tới landing chiến dịch chỉ trong thời gian sale
Nếu bất kỳ trường hợp nào trở thành vĩnh viễn, chuyển sang 301. Công cụ tìm kiếm chờ vài tháng trước khi xử lý một 302 lâu dài như 301, vậy nên để việc dời vĩnh viễn ở 302 sẽ tốn tín hiệu xếp hạng trong khoảng thời gian đó.
Advertisement
Cách Gửi Mã Trạng Thái 302
Hầu hết web server và framework đều có helper sẵn để gửi chuyển hướng 302. Dưới đây là các mẫu phổ biến nhất. Mỗi cái phát ra HTTP 302 Found với header Location — hai thứ duy nhất phản hồi 302 thực sự cần.
Nginx
Trong Nginx, dùng directive return với mã 302 (mặc định nếu bỏ mã cũng là 302):
server {
listen 80;
server_name example.com;
# Chuyển hướng tạm thời (302 Found)
location /old-page {
return 302 https://example.com/new-page;
}
}Apache (.htaccess)
Trên Apache, dùng Redirect với mã 302 hoặc RewriteRule với cờ [R=302,L]:
# Chuyển hướng tạm thời đơn giản
Redirect 302 /old-page https://example.com/new-page
# Hoặc với mod_rewrite cho khớp pattern
RewriteEngine On
RewriteRule ^maintenance$ /maintenance.html [R=302,L]Node.js (Express)
res.redirect() của Express mặc định dùng 302 khi không cung cấp mã:
// Chuyển hướng tạm thời (mặc định 302 Found)
app.get('/dashboard', (req, res) => {
if (!req.user) {
return res.redirect('/login') // gửi 302
}
// ...render dashboard
})
// Hoặc tường minh:
res.redirect(302, '/login')Cách Kiểm Tra Mã Trạng Thái 302
Sau khi triển khai chuyển hướng 302, hãy xác minh nó hoạt động đúng. Cách nhanh nhất là curl từ terminal — nó hiển thị mã trạng thái và header Location chính xác mà không bị nhiễu bởi cache trình duyệt.
# Chỉ hiển thị header phản hồi (-I) mà không đi theo chuyển hướng
curl -I https://example.com/old-page
# Output mong đợi:
# HTTP/2 302
# location: https://example.com/new-page
# cache-control: no-cache
# date: Mon, 27 Apr 2026 14:00:00 GMT
# Theo toàn chuỗi (-L) và hiển thị mỗi bước nhảy
curl -ILs https://example.com/old-page | grep -i 'HTTP/\|location:'Nếu không có terminal, dùng Bộ kiểm tra chuyển hướng miễn phí của DNS Robot để theo dõi toàn chuỗi từ vị trí trung lập, hoặc Bộ kiểm tra HTTP Headers để xem header thô — cả hai đều bỏ qua cache trình duyệt.
Chuyển Hướng 302 và SEO
Mã trạng thái HTTP 302 nói với công cụ tìm kiếm: 'việc dời này là tạm thời, hãy giữ URL gốc trong index.' Điều này có hệ quả trực tiếp cho tín hiệu xếp hạng.
Theo Google Search Central, 302 không chuyển tín hiệu xếp hạng từ URL gốc tới đích chuyển hướng theo cách 301 làm. URL gốc vẫn là canonical. Google vẫn có thể index trang đích nếu các tín hiệu canonical khác (liên kết nội bộ, sitemap, hreflang) trỏ tới — nhưng bản thân 302 không phải là tín hiệu canonical.
Dùng 301 cho việc dời vĩnh viễn — Đổi domain, đổi cấu trúc URL, hợp nhất trang
Dùng 302 cho việc dời tạm thời — Login, A/B test, bảo trì, định tuyến vùng
Đừng để dời vĩnh viễn ở 302 — Google chờ nhiều tháng trước khi xử lý 302 lâu dài như 301, làm bạn mất equity xếp hạng
Tránh chuỗi —
A → 302 → B → 302 → Clàm loãng tín hiệu và chậm tải. Mỗi bước nhảy thêm độ trễ
Tại Sao 302 Đổi Yêu Cầu POST Thành GET
Đây là hành vi đáng ngạc nhiên nhất của HTTP 302. RFC gốc nói client nên bảo toàn phương thức khi đi theo chuyển hướng. Nhưng các trình duyệt sớm — Mosaic, Netscape, IE — tất cả đều đổi POST thành GET trên 302, và hành vi sai đó phổ biến đến mức được chuẩn hóa trong WHATWG Fetch Standard.
Hôm nay, khi trình duyệt gửi POST /login và máy chủ trả 302 Found, trình duyệt tự động phát ra GET /next-page tới đích chuyển hướng. Dữ liệu form bị mất. Đây hiếm khi là điều mà nhà phát triển server muốn.
# Bạn gửi:
POST /submit-form HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
name=Alice&email=alice@example.com
# Máy chủ trả 302:
HTTP/1.1 302 Found
Location: /thank-you
# Trình duyệt theo bằng GET (dữ liệu form bị mất!):
GET /thank-you HTTP/1.1
Host: example.comNếu chuyển hướng cần bảo toàn phương thức gốc (POST vẫn là POST, PUT vẫn là PUT), dùng 307 Temporary Redirect thay vì 302. Nếu cố ý bỏ body và chuyển sang GET — mẫu cổ điển POST/Redirect/GET — dùng 303 See Other. Cả hai đều rõ ràng; 302 thì không.
Advertisement
Lỗi 302 Phổ Biến và Cách Sửa
Khi HTTP 302 sai, thường xuất hiện dưới một trong các triệu chứng sau. Hầu hết có giải pháp đơn giản:
`Nhận 302 thay vì 200` — Máy chủ chuyển hướng khi không nên. Kiểm tra
.htaccess, cấu hình Nginx hoặc middleware của framework để tìm quy tắc chuyển hướng không mong muốn`302 không có header Location` — Phản hồi không hợp lệ. Trình duyệt hiển thị trang trống. Đảm bảo code đặt header
Locationtrước khi gửi trạng thái`302 chuyển hướng đến chính nó` — Vòng lặp chuyển hướng. URL
Locationkhớp URL yêu cầu. Kiểm tra quy tắc xem có thiếu điều kiện không`302 làm mất dữ liệu form` — POST → 302 → GET bỏ body. Chuyển sang
307 Temporary Redirectđể giữ POST`302 bị trình duyệt cache` — Máy chủ lỗi đặt
Cache-Control: max-age=...trên chuyển hướng. ThêmCache-Control: no-cachevà xóa cache trình duyệt`302 trên production nhưng không có local` — Thường là CDN hoặc load balancer thêm chuyển hướng. Test trực tiếp với origin để cô lập
Vòng Lặp Chuyển Hướng 302: Cách Chẩn Đoán
Vòng lặp chuyển hướng xảy ra khi URL A trả 302 về URL B, và URL B trả 302 ngược lại A. Sau 20 bước nhảy (trong Chrome và Firefox), trình duyệt hiển thị ERR_TOO_MANY_REDIRECTS và bỏ cuộc.
Nguyên nhân đơn lẻ phổ biến nhất là xung đột SSL/HTTPS giữa CDN (như Cloudflare) và máy chủ origin: CDN kết nối tới origin qua HTTP, origin chuyển hướng HTTP→HTTPS, CDN bóc HTTPS và kết nối qua HTTP lại — vòng lặp vô hạn.
# Theo toàn chuỗi (giới hạn 10 bước nhảy để tránh vòng lặp vô hạn)
curl -ILs --max-redirs 10 https://example.com 2>&1 | grep -i 'HTTP/\|location:'
# Ví dụ vòng lặp:
# HTTP/2 302
# location: http://example.com/
# HTTP/1.1 302 Found
# Location: https://example.com/
# HTTP/2 302
# location: http://example.com/ <-- vòng lặp xác nhậnNếu thấy hai URL luân phiên trong header Location, bạn đã xác nhận vòng lặp 302. Hướng dẫn đầy đủ xem ở bài ERR_TOO_MANY_REDIRECTS. Bộ kiểm tra chuyển hướng của DNS Robot theo dõi toàn chuỗi từ vị trí trung lập và dừng ở điểm vòng lặp.
Best Practices cho Mã Trạng Thái 302
Gửi 302 Found đúng cách tránh được hầu hết các bug mà nhà phát triển gặp khi triển khai chuyển hướng:
Luôn bao gồm header Location —
302không cóLocationkhông hợp lệ và render thành trang trốngLuôn đặt Cache-Control: no-cache — Nếu không, một số trình duyệt cache chuyển hướng theo phiên, phá vỡ hợp đồng 'tạm thời'
Dùng URL tuyệt đối trong Location —
https://example.com/newrõ ràng;/newhoạt động nhưng có thể vỡ sau proxy đổi hostGiữ chuyển hướng ở một bước nhảy —
A → 302 → Bổn;A → 302 → B → 302 → Cchậm tải và loãng tín hiệuĐừng chuyển hướng từ POST sang trang khác bằng 302 — Dùng
303(GET cố ý) hoặc307(giữ POST)Audit chuyển hướng hàng tháng — Chuyển hướng tạm cũ thường tồn tại lâu hơn lý do. Kiểm tra với Redirect Checker
Chuyển sang 301 khi việc dời thành vĩnh viễn — Đừng để dời vĩnh viễn ở
302quá vài tuần
Hành Vi Trình Duyệt và Cache
Các trình duyệt và trung gian khác nhau xử lý HTTP 302 hơi khác. Biết các đặc điểm tiết kiệm thời gian debug:
| Client | Hành vi mặc định khi gặp 302 | Cache mặc định |
|---|---|---|
| Chrome / Edge | Tự theo, đổi POST→GET | Không cache trừ khi header chỉ định |
| Firefox | Tự theo, đổi POST→GET | Không cache trừ khi header chỉ định |
| Safari | Tự theo, đổi POST→GET | Cache chuyển hướng hơi mạnh hơn |
| curl (mặc định) | KHÔNG theo — hiển thị 302 + Location | Không cache |
| curl -L | Theo tới --max-redirs (mặc định 50) | Không cache |
| wget (mặc định) | Tự theo tới --max-redirect=20 | Không cache |
| Googlebot | Theo, coi là tín hiệu tạm thời | Crawl lại URL gốc |
Để xác minh hành vi chuyển hướng trong các trường hợp biên (phương thức POST, vòng lặp vô hạn, sự hiện diện của header), Bộ kiểm tra HTTP Headers của DNS Robot hiển thị phản hồi thô mà không bị viết lại phương thức bên phía trình duyệt. Đọc thêm về chuyển hướng tạm thời tại tài liệu MDN và đặc tả RFC 9110.
Advertisement
Theo dõi chuỗi chuyển hướng trong vài giây
Dùng Bộ kiểm tra chuyển hướng miễn phí của DNS Robot để kiểm tra mọi bước nhảy trong chuỗi — mã trạng thái, header Location và đích cuối từ máy chủ trung lập (không có cache trình duyệt).
Thử Bộ kiểm tra chuyển hướngAdvertisement
Câu Hỏi Thường Gặp
Mã trạng thái 302 (HTTP 302 Found) nghĩa là tài nguyên được yêu cầu tạm thời nằm ở một URL khác được chỉ định bởi header Location của phản hồi. Client nên đi theo chuyển hướng cho yêu cầu này nhưng tiếp tục dùng URL gốc cho các yêu cầu trong tương lai. Đây là phiên bản tạm của 301 Moved Permanently.