Mã trạng thái HTTP

Tham khảo đầy đủ các mã trạng thái phản hồi HTTP với các giải thích và các trường hợp sử dụng.

Các danh mục mã trạng thái HTTP

Sự khác biệt giữa 301 và 302 là gì?

301 Moved Permanently chỉ ra cho các client rằng tài nguyên đã được di chuyển vĩnh viễn · các công cụ tìm kiếm chuyển xếp hạng. 302 Found là một chuyển hướng tạm thời · URL gốc giữ lại xếp hạng của nó.

Khi nào sử dụng 401 thay vì 403?

401 Unauthorized có nghĩa là «chưa được xác thực» · client phải cung cấp các credentials. 403 Forbidden có nghĩa là «đã được xác thực nhưng không được phép» · các credentials sẽ không thay đổi điều này.

Mã trạng thái 418 có nghĩa là gì?

418 «I'm a teapot» là một trò đùa cá tháng tư từ RFC 2324 (Hyper Text Coffee Pot Control Protocol). Nó không được sử dụng trong thực tế nhưng nổi tiếng trong văn hóa nhà phát triển.

Một Chuẩn Với Ba Thập Kỷ Biến Đổi

Mã trạng thái HTTP đã trải qua nhiều thế hệ đặc tả. RFC 1945 (tháng 5 năm 1996) đã chuẩn hóa HTTP/1.0 với các danh mục 1xx-5xx cơ bản. RFC 2616 (tháng 6 năm 1999) đã phát hành HTTP/1.1 và là tài liệu tham chiếu chuẩn trong hơn một thập kỷ. Bộ 7230-7235 (tháng 6 năm 2014) đã chia HTTP/1.1 thành nhiều đặc tả theo chủ đề. Chuẩn hợp nhất hiện tại là RFC 9110 «HTTP Semantics» (tháng 6 năm 2022), thay thế bộ 7230-7235 và là tài liệu tham chiếu phù hợp cho công việc hiện đại. Sổ đăng ký đầy đủ các mã được gán nằm tại đăng ký mã trạng thái HTTP của IANA.

Năm Danh Mục Tổng Quan

Các So Sánh «vs» Khiến Mọi Người Nhầm Lẫn

401 vs 403. Cặp bị nhầm lẫn nhiều nhất. 401 Unauthorized có nghĩa là «bạn chưa xác thực, hãy thử đăng nhập» (tên này về mặt kỹ thuật gây hiểu nhầm, nó nói về xác thực danh tính, không phải phân quyền). 403 Forbidden có nghĩa là «bạn đã xác thực, nhưng bạn không được phép làm điều này», thông tin đăng nhập hợp lệ nhưng không cấp quyền truy cập tài nguyên này. Lỗi thường gặp: trả về 403 cho các yêu cầu chưa xác thực khi 401 kèm tiêu đề WWW-Authenticate mới là đúng.

301 vs 302 vs 307 vs 308. Hai chiều: vĩnh viễn so với tạm thời, và hành vi bảo toàn phương thức:

Vĩnh viễn?Phương thức được giữ?Tín hiệu xếp hạng SEO
301 Moved PermanentlyLịch sử các máy khách đã đổi POST → GETVĩnh viễn, chuyển xếp hạng sang URL mới
302 FoundKhôngLịch sử các máy khách đã đổi POST → GETTạm thời, URL gốc giữ nguyên xếp hạng
307 Temporary RedirectKhôngNghiêm ngặt, POST giữ nguyên POSTGiống như 302
308 Permanent RedirectNghiêm ngặt, POST giữ nguyên POSTGiống như 301

Nếu bạn đang chuyển hướng các yêu cầu GET cho mục đích SEO, 301 là lựa chọn thông thường. Nếu bạn đang chuyển hướng các yêu cầu POST hoặc PUT và muốn giữ nguyên phương thức, bạn cần 307 hoặc 308.

400 vs 422. 400 Bad Request dành cho các yêu cầu không đúng cú pháp: JSON không hợp lệ, thiếu tiêu đề bắt buộc, tham số truy vấn không hợp lệ. 422 Unprocessable Entity (ban đầu là mã WebDAV, được REST API áp dụng rộng rãi) dành cho các yêu cầu đúng cú pháp nhưng có vấn đề ngữ nghĩa: JSON phân tích đúng nhưng giá trị không qua được xác thực nghiệp vụ (số lượng âm trong đơn hàng, email đã được sử dụng). Nhiều API sử dụng cả hai.

502 vs 503 vs 504. Ba chế độ lỗi upstream khác nhau:

404 vs 410. 404 Not Found là «chúng tôi không biết tài nguyên này có tồn tại hay không.» 410 Gone là «tài nguyên này từng tồn tại, đã bị xóa vĩnh viễn.» Tác động SEO: Google coi 410 là tín hiệu mạnh hơn rằng nội dung không còn tồn tại vĩnh viễn và xóa khỏi chỉ mục nhanh hơn so với 404.

Quy Ước REST API

Các REST API hiện đại đã hội tụ về một bộ quy ước khá nhất quán về ý nghĩa của mã trạng thái cho từng hành động:

Phương thứcTrường hợp thành côngLỗi thường gặp
GET200 OK kèm body, hoặc 304 Not Modified nếu đã được lưu cache404 nếu tài nguyên không tồn tại, 403 nếu bị cấm
POST (tạo mới)201 Created kèm tiêu đề Location trỏ đến tài nguyên mới400 cho body không hợp lệ, 422 cho lỗi xác thực, 409 cho xung đột
PUT (thay thế) / PATCH (cập nhật)200 OK kèm body đã cập nhật, hoặc 204 No Content404 nếu tài nguyên không tồn tại, 409 cho xung đột phiên bản
DELETE204 No Content (hoặc 200 kèm xác nhận xóa)404 nếu không tồn tại
Bất kỳ (giới hạn tốc độ)-429 Too Many Requests kèm tiêu đề Retry-After
Bất kỳ (xác thực)-401 nếu chưa xác thực, 403 nếu đã xác thực nhưng không có quyền

Tác Động SEO

Các Mã Nổi Tiếng & Văn Hóa

Các Lỗi Thường Gặp

  1. Dùng 200 OK cho lỗi kèm body lỗi. Trả về {"error": "not found"} với trạng thái 200 gây nhầm lẫn cho mọi tầng cache, công cụ giám sát và SDK client. Hãy dùng mã trạng thái đúng.
  2. Trả về 403 cho các yêu cầu chưa xác thực. Mã đúng là 401 kèm tiêu đề WWW-Authenticate.
  3. Dùng 302 khi bạn muốn dùng 301. Nếu việc di chuyển là vĩnh viễn, công cụ tìm kiếm cần 301 để chuyển xếp hạng. 302 giữ URL cũ trong chỉ mục.
  4. Dùng 301 hoặc 302 cho các chuyển hướng POST/PUT. Trong lịch sử, các mã này cho phép máy khách đổi phương thức sang GET. 307308 bảo toàn nghiêm ngặt phương thức gốc.
  5. Trả về 500 khi bạn muốn dùng 503. Nếu máy chủ bị quá tải hoặc đang bảo trì, 503 kèm Retry-After là tín hiệu đúng, cho cả máy khách lẫn Googlebot.
  6. Dùng 404 cho các trang đã bị xóa vĩnh viễn. 410 Gone là tín hiệu mạnh hơn và được xóa khỏi chỉ mục công cụ tìm kiếm nhanh hơn.
  7. Quên tiêu đề Location trong các phản hồi 2013xx. Tiêu đề Location là thứ cho máy khách biết tài nguyên mới ở đâu hoặc nơi cần chuyển hướng. Nếu không có nó, máy khách không thể điều hướng.

Câu Hỏi Thường Gặp Thêm

Khi nào nên trả về 422 thay vì 400?

400 Bad Request có nghĩa là chính yêu cầu bị lỗi định dạng: JSON không hợp lệ, thiếu tiêu đề bắt buộc, tham số truy vấn không hợp lệ. 422 Unprocessable Entity có nghĩa là yêu cầu đúng định dạng nhưng chứa lỗi ngữ nghĩa ngăn xử lý: trường số lượng đặt về số âm, địa chỉ email đã được sử dụng, ngày trong quá khứ cho trường chỉ chấp nhận tương lai. Quy ước REST API hiện đại đã hội tụ về cách phân chia này, với hầu hết các API lớn (GitHub, Stripe, Twilio) sử dụng 422 cho lỗi xác thực.

Tại sao Cloudflare đôi khi trả về 520, 521, 522…?

Các mã 520-527 là đặc thù của Cloudflare, báo hiệu các cách khác nhau mà edge của họ không thể kết nối đến máy chủ gốc của bạn. 520 là lỗi chung «máy chủ web trả về lỗi không xác định»; 521 có nghĩa là máy chủ gốc của bạn từ chối kết nối; 522 là timeout kết nối đến máy chủ gốc; 524 có nghĩa là máy chủ gốc của bạn phản hồi quá chậm. Chúng không có trong IANA registry nhưng thường gặp khi các trang web phía sau Cloudflare có vấn đề backend.

Trình duyệt có hiển thị mã nào API của tôi trả về không?

Có, mở DevTools → tab Network, nhấp vào yêu cầu và xem cột «Status». Trình duyệt cũng hiển thị các trang chung cho một số mã (trò chơi khủng long trên các lỗi kết nối Chrome, các trang 404/500 chuẩn); nhưng mã số thực tế luôn có trong phản hồi.

103 Early Hints là gì?

1xx tương đối mới (RFC 8297, 2017) cho phép máy chủ gửi tiêu đề Link: rel=preload trước khi phản hồi đầy đủ sẵn sàng, yêu cầu trình duyệt bắt đầu tải về các tài nguyên quan trọng (CSS, font, hình ảnh) sớm hơn. Hiện được Chrome hỗ trợ và triển khai bởi Cloudflare, Fastly và các CDN khác như một tối ưu hóa hiệu suất.

Tôi có thể tự tạo mã trạng thái riêng không?

Về mặt kỹ thuật là có (HTTP cho phép bất kỳ mã 3 chữ số nào trong phạm vi 100-599, nhưng thực tế là không nên), máy khách, proxy và cache xử lý các mã không xác định theo chữ số đầu tiên (nên 4xx = lỗi máy khách nói chung, 5xx = lỗi máy chủ). Một số nhà cung cấp làm điều này (520s của Cloudflare, 444 của Nginx), nhưng trừ khi bạn kiểm soát cả hai đầu kết nối, hãy tuân theo IANA registry. Tự đặt ra 299 sẽ không gây lỗi nhưng cũng không truyền đạt được gì.

Tại sao «status code» được gọi là «status» chứ không phải «error code»?

Vì hầu hết chúng không phải là lỗi. 200 OK là mã trạng thái được trả về nhiều nhất trên thế giới, nghĩa là «mọi thứ đều ổn.» Các mã này truyền đạt trạng thái của yêu cầu: thành công, chuyển hướng, lỗi máy khách, lỗi máy chủ. Gọi chúng là «error codes» sẽ thiên về các trường hợp tiêu cực được ghi log và chú ý; các mã thành công đang thực hiện công việc của chúng một cách im lặng mỗi micro giây.

Công cụ liên quan

Bộ Phân Tích & Giải Mã URL Trình tạo .htaccess Bộ mã hóa/giải mã URL miễn phí