Chuyển hướng 301 và 308

301 và 308 đều là chuyển hướng vĩnh viễn. Tìm hiểu khác biệt về bảo toàn phương thức và body HTTP, cách Google/Bing xử lý hai mã, và khi nào API hoặc biểu mẫu thực sự cần 308.

Xuất bản lần đầu: 2 thg 7, 2026 · Cập nhật lần cuối: 22 thg 8, 2026 · Advanced
Ngôn ngữ
1 tín hiệu bằng chứng trên trang này

301 và 308 đều là chuyển hướng vĩnh viễn, và Google cùng Bing xử lý chúng giống nhau cho crawl, lập chỉ mục và tín hiệu. Khác biệt nằm ở giao thức: 308 bảo đảm client lặp lại cùng phương thức và body tại URL mới, còn 301 mơ hồ riêng về việc POST có thể đổi thành GET. Với di chuyển trang, site hoặc HTTPS thông thường, 301 vẫn là mặc định thực dụng vì được hỗ trợ rộng. Chỉ dùng 308 khi phải giữ một yêu cầu không phải GET, chẳng hạn endpoint API, webhook, action biểu mẫu hoặc luồng POST xác thực; ngay cả khi đó vẫn phải kiểm thử thông tin xác thực, cookie và tính idempotent bằng client thật. Không có lợi ích SEO khi đổi 301 thành 308.

Tóm tắt — Hai mã này cùng biểu thị một lần chuyển vĩnh viễn và được Google lẫn Bing xử lý như nhau. Tài liệu Google nói 308 “equivalent to 301 (bản dịch) «tương đương với 301», Illyes nói “we just merge that with 301,” (bản dịch) «chúng tôi chỉ hợp nhất nó với 301», còn Canel xác nhận Bing xử lý hai mã như nhau. Ở tầng giao thức, khác biệt cốt lõi là giữ phương thức: 308 theo RFC 7538 năm 2015 bảo đảm client lặp lại cùng phương thức tại URL mới và mang theo body; 301 có từ thời HTTP/1.0 và mơ hồ riêng về việc đổi POST thành GET. RFC không quy định PUT hay DELETE theo hướng nào, nên đừng khái quát cảnh báo POST sang chúng. 308 tồn tại để trở thành mã vĩnh viễn song hành với 307: RFC 7231 đã có mã tạm thời giữ phương thức nhưng thiếu bản vĩnh viễn, và 308 lấp khoảng trống đó. Mặc định dùng 301 cho di chuyển trang, site hoặc HTTPS thông thường vì lâu đời, phổ biến và được CDN/CMS/plugin hỗ trợ tốt hơn. Chỉ dùng 308 khi phải giữ yêu cầu không phải GET như endpoint API, webhook, action biểu mẫu hoặc luồng POST xác thực. Ngay cả khi đó, hãy kiểm thử thông tin xác thực, cookie và tính idempotent bằng client thật. Không mã nào “tốt hơn cho SEO”; đó là quan niệm sai đã được các công cụ tìm kiếm bác bỏ rõ ràng.

Khác biệt ngữ nghĩa phải được xét trước

301 và 308 cùng báo cho công cụ tìm kiếm rằng tài nguyên đã chuyển vĩnh viễn và đích nên trở thành canonical. Chúng chỉ khác nhau ở một bảo đảm cơ học hẹp về cách client phát lại yêu cầu.

  • 301 (Moved Permanently) là mã chuyển hướng vĩnh viễn gốc từ thời HTTP/1.0. Điểm quan trọng là mã này luôn mơ hồ về việc có phải giữ phương thức yêu cầu hay không. Trong thực tế, trình duyệt và client lâu nay có thể đổi POST thành GET khi theo 301; điều đó ổn với trang thường nhưng âm thầm phá chức năng phụ thuộc vào phương thức hoặc body yêu cầu.
  • 308 (Permanent Redirect) là phiên bản nghiêm ngặt. Nó bảo đảm client lặp lại chính phương thức và body cũ tại URL mới. POST vẫn là POST và payload được mang theo.

Cách nói một câu: 308 là 301 có thêm bảo đảm trình duyệt không âm thầm đổi POST thành GET. Evidence for this claim RFC 9110 defines both 301 and 308 as permanent redirects; 308 forbids changing the request method, while 301 permits POST-to-GET rewriting for historical reasons. Scope: HTTP semantics for 301 and 308 responses. Confidence: high · Verified: IETF: RFC 9110 §§15.4.2, 15.4.9 IETF: RFC 7538 §3 — 308 Permanent Redirect

Vì sao 308 tồn tại: thiếu một “307 vĩnh viễn”

Đây là phần hầu như không ai giải thích, nhưng là cách rõ nhất để hiểu toàn bộ so sánh: đặc tả từng có một khoảng trống.

Các mã chuyển hướng hiện đại tạo thành lưới tạm thời/vĩnh viễn và lỏng/nghiêm ngặt:

Tạm thờiVĩnh viễn
Có thể đổi phương thức (lỏng)302301
Giữ phương thức (nghiêm ngặt)307308

RFC 7231 định nghĩa 307, một chuyển hướng tạm thời giữ phương thức, làm đối tác nghiêm ngặt của 302 vốn lỏng và mơ hồ. Nhưng RFC chưa có mã vĩnh viễn giữ phương thức. RFC 7538 tháng 4 năm 2015 bổ sung 308 để lấp khoảng trống: 308 đối với 301 giống như 307 đối với 302. Nếu đã đọc bài so sánh 302 và 307 trong cụm này, quan hệ 301 với 308 là cùng một quan hệ ở hàng vĩnh viễn — lỏng và nghiêm ngặt.

301 có trước toàn bộ khung này. Nó đến từ HTTP/1.0, trước khi khái niệm “giữ phương thức” được chuẩn hóa; đó chính là lý do mã bị mơ hồ và cần phát minh 308 thay vì chỉ làm rõ 301.

“Giữ phương thức và body” có nghĩa gì trong thực tế

Với phần lớn chuyển hướng — người dùng nhấp liên kết, trình duyệt gửi GET, máy chủ đưa họ đến nơi khác — không có khác biệt thực tế. Trình duyệt hiện đại giữ GET khi theo 301. Khác biệt chỉ quan trọng khi yêu cầu không phải GET thường:

Loại yêu cầuSau 301Sau 308
GET (trang thường)Thực tế vẫn theo bằng GETTheo bằng GET
POST (biểu mẫu, API)Có thể âm thầm đổi thành GET, mất bodyLặp lại bằng POST, giữ nguyên body
PUT / DELETE (API)RFC không ghi rõ; ngoại lệ lịch sử chỉ là POST→GET, nên phải coi là phụ thuộc client và chưa xác minhGiữ phương thức; quy tắc tự động theo của 308 không chỉ dành cho POST

Rủi ro của 301 tập trung vào POST và body yêu cầu — biểu mẫu, API, webhook và luồng xác thực. Câu “301 luôn phá biểu mẫu” là nói quá; GET thường vẫn an toàn. Ngoại lệ lịch sử trong đặc tả 301 chỉ nói POST→GET, không ghi hành vi PUT hay DELETE, nên đừng giả định mà không kiểm thử client thật. Điều đặc tả nói rõ là 308 cấm client đổi bất kỳ phương thức nào được lặp lại; quy tắc đó không giới hạn ở POST. Chỉ phương thức được bảo đảm giữ nguyên; header, cookie, thông tin xác thực và toàn bộ giao dịch vẫn phụ thuộc vào client cùng tích hợp, nên phải kiểm thử những luồng quan trọng.

Google có xử lý 301 và 308 khác nhau cho SEO không? Không.

Đây là câu hỏi hiếm hoi về chuyển hướng mà tài liệu, nhân viên Google và Bing đều đồng ý, nhất quán trong nhiều năm.

Tài liệu mã trạng thái HTTP của Google đặt 301 và 308 cùng nhóm. Dòng 301 viết: “Google follows the redirect, and Google systems use the redirect as a strong signal that the redirect target should be processed.” (bản dịch) «Google đi theo chuyển hướng và hệ thống Google dùng nó làm tín hiệu mạnh rằng đích nên được xử lý.» Dòng 308 chỉ có một câu: “Equivalent to 301.” (bản dịch) «Tương đương với 301.» Đây là bằng chứng mạnh và dễ trích dẫn nhất: tài liệu Google đánh đồng hai mã. Evidence for this claim Google treats 308 as equivalent to 301 for Search while advising sites to use the semantically appropriate status code. Scope: Google Search processing; client behavior still differs when method preservation matters. Confidence: high · Verified: Google: HTTP status codes and Search

Hướng dẫn chuyển hướng củng cố điều đó ngay phần mở đầu: “The 301 and 308 status codes mean that a page has permanently moved to a new location” (bản dịch) «Mã trạng thái 301308 có nghĩa trang đã chuyển vĩnh viễn sang vị trí mới», rồi không phân biệt thêm giữa chúng.

Nhân viên Google đã nói điều tương tự không chính thức từ nhiều năm trước khi nó xuất hiện trong tài liệu:

  • Gary Illyes (2021): trong một chuỗi thảo luận về việc Google có xử lý 308 như 301 hay không, ông nói Google “just merge[s] that with 301 so we really don’t care.” (bản dịch) «chỉ hợp nhất nó với 301 nên thực sự không quan tâm». Bài của Barry Schwartz gọi đây là thời điểm điều đó trở thành chính thức: “Three years later it was added to the official Google documents that Google treats 308 redirects like 301 redirects — so now it is official.” (bản dịch) «Ba năm sau, tài liệu chính thức của Google bổ sung rằng Google xử lý 308 như 301, nên giờ điều đó đã chính thức.»
  • John Mueller (2018): ba năm trước đó, ông nói “If you use it [a 308 redirect] like a 301 we’ll treat it as such.” (bản dịch) «Nếu bạn dùng 308 như 301, chúng tôi sẽ xử lý như vậy.» Lập trường không chính thức của Google đã tồn tại từ lâu trước khi tài liệu bắt kịp.

Tuy nhiên, tài liệu Google có một sắc thái quan trọng — cũng là luận điểm của bài này. Ngay sau khi đánh đồng hai mã, Google thêm: “While Google treats these status codes the same way, keep in mind that they’re semantically different. Use the status code that’s appropriate for the redirect so other clients (for example, e-readers, other search engines) may benefit from it.” (bản dịch) «Dù Google xử lý các mã này giống nhau, hãy nhớ chúng khác nhau về ngữ nghĩa. Dùng mã phù hợp để các client khác như thiết bị đọc sách điện tử và công cụ tìm kiếm khác có thể hưởng lợi.» Nói cách khác: hãy chọn mã vì tính đúng đắn và khả năng tương tác, không phải SEO, vì SEO không phân biệt.

Bing có xử lý 301 và 308 khác nhau không? Cũng không.

Phần lớn bài viết chỉ nói về Google. Fabrice Canel của Bing trả lời trực tiếp vào tháng 9 năm 2024 khi được hỏi Bing có xử lý 308 vĩnh viễn giống 301 không: “Bing treats 308 redirects the same as 301 redirects.” (bản dịch) «Bing xử lý chuyển hướng 308 giống chuyển hướng 301.» Schwartz lưu ý điều này phù hợp với phát biểu của Google năm 2021.

Vì vậy, cả hai công cụ lớn đều xác nhận: 308 giống 301 về chức năng crawl, lập chỉ mục và hợp nhất tín hiệu. Không công cụ nào coi 308 vượt trội hơn về SEO.

Quan niệm cần bác bỏ: “308 tốt hơn cho SEO / hãy đổi mọi 301”

Tôi nói thẳng vì các trang chất lượng thấp vẫn ám chỉ điều ngược lại: không có lợi ích SEO khi chọn 308 thay 301 cho chuyển hướng thông thường và không có lý do đổi hàng loạt 301 hiện có thành 308. Đây không phải ý kiến cá nhân mà là lập trường đã công bố của công cụ tìm kiếm:

  • Tài liệu Google nói 308 “equivalent to 301 (bản dịch) «tương đương với 301».
  • Illyes: “we just merge that with 301.” (bản dịch) «chúng tôi chỉ gộp mã đó chung với 301».
  • Canel: Bing “treats 308 redirects the same as 301 redirects” (bản dịch) «xử lý chuyển hướng 308 giống chuyển hướng 301».

Đổi hàng loạt 301→308 không đem lại lợi ích xếp hạng nào và tạo rủi ro cho công cụ cũ hoặc công cụ edge chỉ nhận diện tốt 301/302. Đó chỉ là thay đổi không tạo giá trị.

Nên đối chiếu với một quan niệm sai thực sự từng gây tranh cãi: “301 làm mất hoặc pha loãng PageRank”. Google đã nhiều lần bác bỏ điều đó. Nhưng khác biệt là quan niệm PageRank cần Google sửa lại cách hiểu cũ, còn tính tương đương 301 và 308 được Google, Bing và tài liệu nhất quán cùng khẳng định từ năm 2018. Đây là câu hỏi đã ngã ngũ, không phải tranh luận. Toàn bộ câu chuyện PageRank nằm trong bài so sánh 301 với 302 của cụm này.

Khi 308 là lựa chọn đúng về kỹ thuật

Hãy dùng 308 khi mất phương thức hoặc body yêu cầu sẽ phá chức năng, không phải thứ hạng:

  • Endpoint API đang được di chuyển, nơi client gửi POST/PUT/DELETE.
  • URL webhook — bên gửi POST một payload không thể để mất.
  • Đích action của biểu mẫu — thẻ <form> gửi dữ liệu phải đến nguyên vẹn tại URL mới.
  • Luồng POST xác thực hoặc đăng nhập có thông tin xác thực hay token trong body.

Riêng với POST, 301 có nguy cơ khiến client đổi yêu cầu thành GET và bỏ lại body; 308 cấm việc đổi đó. Với PUT/DELETE, RFC không ghi hành vi 301 theo hướng nào, nên đừng giả định; quy tắc giữ phương thức của 308 vẫn áp dụng bất kể phương thức nào.

Trước khi chuyển API, webhook hoặc luồng xác thực, hãy nhớ riêng mã trạng thái không bảo đảm mọi thứ sống sót qua hop; cần kiểm tra trong cùng thay đổi:

  • Thông tin xác thực, cookie và header auth. Không mã nào hứa bảo toàn chúng; hãy kiểm thử client thật như trình duyệt, SDK hoặc bên gửi webhook.
  • Hành vi khác origin. Chuyển hướng qua origin khác có thể thay đổi dữ liệu trình duyệt hoặc fetch client gửi; xác minh bằng caller thật, không chỉ curl thủ công.
  • Tính idempotent và tác dụng phụ lặp. Nếu yêu cầu lặp không idempotent — webhook tạo bản ghi hoặc POST thanh toán — client thử lại sau chuyển hướng có thể kích hoạt hai lần. Xác nhận đích xử lý lặp an toàn trước khi trông chờ 308 “tự hoạt động”.
  • Triển khai và hoàn tác với cache trong đầu. Cả phản hồi 301 và 308 đều có thể cache theo suy đoán, nên client hoặc trung gian đã cache phản hồi cũ có thể tiếp tục dùng nó sau khi đổi mã. Hãy kiểm thử bằng client mới và client đã truy cập trước thay đổi; kế hoạch hoàn tác phải tính đến trạng thái cache thay vì giả định việc chuyển đổi có hiệu lực tức thì.

Khi 301 vẫn là mặc định thực dụng

Với mọi thứ là GET thường — tức phần lớn nội dung người làm SEO chuyển hướng — 301 vẫn là lựa chọn hợp lý:

  • Thay đổi trang/URL và di chuyển nội dung thông thường.
  • Đổi miền và hợp nhất website.
  • Di chuyển HTTP → HTTPS.
  • Hợp nhất biến thể www/không www hoặc có/không dấu gạch chéo cuối.

Vì sao mặc định dùng mã cũ hơn khi 308 “nghiêm ngặt” hơn? Có ba lý do thực tế:

  1. Được nhận diện rộng hơn. 301 có trước 308 hai thập kỷ và được gần như mọi trình duyệt, proxy, CDN, crawler cùng công cụ phân tích hiện tại lẫn cũ nhận diện. 308 nay đã hơn một thập kỷ và được hỗ trợ rộng, nhưng phần đuôi dài của client cùng công cụ edge cũ vẫn kém chắc chắn; đừng giả định mọi công cụ trong stack nhận diện nó.
  2. Thực tế công cụ. Nhiều công cụ phổ biến mặc định hoặc chỉ hiển thị rõ 301/302. Plugin WordPress, trình tạo quy tắc Cloudflare và một số nền tảng serverless/CDN thiên về 301/302; vài nền tảng phát 302/307 bất kể cấu hình bạn nghĩ đã đặt. Với chủ site không chuyên kỹ thuật, “nền tảng thực sự hỗ trợ gì” thường là yếu tố quyết định.
  3. Không có gì để đạt thêm. Vì Google và Bing xử lý hai mã như nhau khi crawl và lập chỉ mục, không có lợi ích khi dùng mã ít phổ biến hơn cho lần di chuyển trang thường.

Quy tắc kinh nghiệm: GET thường → 301; yêu cầu không phải GET cần giữ nguyên → 308.

Cách triển khai từng mã

Cú pháp gần như giống nhau; bạn chỉ đổi con số.

Apache (.htaccess)

# 301 — permanent, for a normal page move
Redirect 301 /old-page /new-page

# 308 — permanent + method-preserving, for an API/form endpoint
RewriteEngine On
RewriteRule ^old-api/(.*)$ /new-api/$1 [R=308,L]

nginx

# 301
location = /old-page {
    return 301 /new-page;
}

# 308 — preserves POST body to the API
location = /old-api {
    return 308 /new-api;
}

Một lưu ý áp dụng cho cả hai: một số CDN, nền tảng edge và plugin CMS không tôn trọng cấu hình 308 mà phát 301/302/307. Nếu giữ phương thức thực sự quan trọng, hãy xác minh phản hồi thật đang gửi bằng cách dùng curl và đọc dòng trạng thái thay vì tin cấu hình. Cú pháp chỉ thị cũng thay đổi theo phiên bản máy chủ và framework; hãy kiểm tra tài liệu phiên bản Apache/nginx hiện tại hoặc framework tạo chuyển hướng thay vì giả định ví dụ trên đúng từng byte cho hệ thống của bạn.

Một đòn bẩy quan trọng hơn lựa chọn 301 hay 308: độ dài chuỗi

Dù chọn mã nào, đòn bẩy hiệu suất lớn hơn là giữ chuyển hướng ngắn. Google theo tối đa khoảng 10 hop chuyển hướng trước khi bỏ cuộc; mỗi hop tăng độ trễ và tạo thêm cơ hội thất thoát tín hiệu. Một hop sạch với mã đúng tốt hơn chuỗi nhiều mã “đúng về kỹ thuật”. Hãy chuyển thẳng đến đích cuối.

Vị trí của chủ đề này

301 và 308 là hai mã chuyển hướng vĩnh viễn. Mỗi mã có bài chuyên sâu riêng trong cụm này, bên cạnh mã tạm thời 302, người anh em nghiêm ngặt 307 và mã 3xx khác là 303. Các bài so sánh tạo thành một lưới: 301 với 302 là vĩnh viễn và tạm thời; 302 với 307 là cặp tạm thời lỏng và nghiêm ngặt; 301 với 308 là cặp vĩnh viễn lỏng và nghiêm ngặt. Cũng cần chú ý rủi ro vận hành như chuỗi và vòng lặp chuyển hướng. Để xem toàn bộ phản hồi máy chủ, hãy đọc trung tâm Mã trạng thái HTTP; loại chuyển hướng cũng là một trong các tín hiệu trong bài canonical hóa.

Try it live

These are real endpoints on this site — not a simulation. Hit them from the button, open them in a new tab, or curl -i them from your terminal, and the server answers with the actual status code this article is about.

Open in new tab ↗
Open in new tab ↗

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.