Chuyển hướng tạm thời 307

Chuyển hướng 307 là gì, cách nó bắt buộc giữ phương thức HTTP khác 302, trường hợp HSTS và chuyển tạm thời, cùng cách Google xử lý cho SEO.

Xuất bản lần đầu: 28 thg 6, 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

307 Temporary Redirect có cùng ý nghĩa với 302 đối với Google: tín hiệu tạm thời yếu không chuyển thứ hạng URL gốc sang đích, nên không có lý do xếp hạng để ưu tiên mã này. Khác biệt thật là bảo đảm của đặc tả: 307 không được đổi phương thức yêu cầu hay body, vì vậy POST vẫn là POST. Điều này quan trọng với biểu mẫu, API và framework hiện đại như Next.js, nhưng không liên quan đến chuyển trang GET thông thường. Mã 307 gây nhầm nhất hoàn toàn không phải chuyển hướng: đó là dấu vết chỉ có trong trình duyệt khi HSTS nâng http lên https, với body 0 byte mà máy chủ không gửi. Redirect checker hoặc yêu cầu curl thông thường cho thấy mã thật; chỉ dùng phiên ẩn danh không đủ với tên miền HSTS preload.

Tóm tắt — 307 là chuyển hướng tạm thời mà theo RFC 9110 “MUST NOT change the request method.” (bản dịch) «KHÔNG ĐƯỢC thay đổi phương thức yêu cầu» — bảo đảm cứng mà 302 không có. Với SEO, lựa chọn này gần như không tạo khác biệt: tài liệu Google ghi 307 “Equivalent to 302 (bản dịch) «tương đương 302», tức tín hiệu tạm thời yếu; Mueller nói lựa chọn 307 hay 302 “doesn’t really matter” (bản dịch) «không thực sự quan trọng» cho tìm kiếm, mà phụ thuộc chuyển hướng có cần hoạt động với POST/API hay không. 307 gây nhầm nhất là dấu vết HSTS: “chuyển hướng” 0 byte chỉ có trong trình duyệt, do trình duyệt tự nâng http lên https và máy chủ chưa từng gửi. Hai trường hợp này không liên quan về chức năng; phân biệt chúng là nhiệm vụ chính.

307 có hai trường hợp hoàn toàn khác nhau

Đây là cách tổ chức toàn bộ chủ đề và đến từ hướng dẫn mã trạng thái của tôi, nơi 307 có hai mục riêng: “307 Temporary Redirect – Has the same functionality as a 302 redirect, except you can’t switch between POST and GET” (bản dịch) «307 Temporary Redirect có chức năng như 302, ngoại trừ không thể đổi giữa POST và GET»; và “307 HSTS Policy – Forces the client to use HTTPS when making requests instead of HTTP.” (bản dịch) «Chính sách 307 HSTS buộc client dùng HTTPS thay cho HTTP». Chúng chỉ chung con số:

  1. 307 là chuyển hướng tạm thời thật do máy chủ phát — được chọn chủ ý hoặc do framework mặc định để giữ phương thức HTTP và body trên yêu cầu không phải GET.
  2. 307 là dấu vết HSTS trong trình duyệt — không phải phản hồi máy chủ. Trình duyệt tự nâng http lên https rồi gắn nhãn 307.

Đánh đồng hai trường hợp này là nguồn gây nhầm phổ biến nhất. Hãy xem từng trường hợp.

Trường hợp 1: 307 thật và yêu cầu của đặc tả

RFC 9110, đặc tả ngữ nghĩa HTTP hiện hành, quy định rõ tại §15.4.8:

“The 307 (Temporary Redirect) status code indicates that the target resource resides temporarily under a different URI and the user agent MUST NOT change the request method if it performs an automatic redirection to that URI.” (bản dịch) «Mã trạng thái 307 cho biết tài nguyên đích tạm thời nằm dưới một URI khác; nếu user agent tự động chuyển hướng đến URI đó thì user agent KHÔNG ĐƯỢC thay đổi phương thức của yêu cầu.»

Evidence for this claim RFC 9110 defines 307 Temporary Redirect as a temporary move and requires clients not to change the request method when following it automatically. Scope: HTTP semantics for real server 307 responses, not browser-internal HSTS displays. Confidence: high · Verified: IETF: RFC 9110 §15.4.8 — 307 Temporary Redirect

Cụm “MUST NOT” là yêu cầu cứng, không phải gợi ý. So với mục 302 (§15.4.3), đặc tả thừa nhận vấn đề lịch sử mà 307 được tạo để sửa: “For historical reasons, a user agent MAY change the request method from POST to GET for the subsequent request. If this behavior is undesired, the 307 (Temporary Redirect) status code can be used instead.” (bản dịch) «Vì lý do lịch sử, user agent CÓ THỂ đổi phương thức từ POST sang GET cho yêu cầu tiếp theo; nếu không muốn hành vi đó, có thể dùng 307.» Nói cách khác, 307 tồn tại để loại bỏ sự mơ hồ POST→GET của client cũ với 302.

MDN diễn đạt khác biệt thực tế như sau:

“The difference between 307 and 302 is that 307 guarantees that the client will not change the request method and body when the redirected request is made. With 302, older clients incorrectly changed the method to GET. 307 and 302 responses are identical when the request method is GET.” (bản dịch) «Khác biệt giữa 307 và 302 là 307 bảo đảm client không thay đổi phương thức yêu cầu và body khi tạo yêu cầu sau chuyển hướng. Với 302, các client cũ từng đổi sai phương thức sang GET. Phản hồi 307 và 302 hoàn toàn giống nhau khi phương thức yêu cầu là GET.»

Câu cuối quan trọng nhất với SEO. Gần như mọi chuyển hướng trang mà SEO quan tâm đều là GET, nên 307 và 302 giống hệt nhau trong trường hợp đó. Bảo đảm giữ phương thức chỉ phát huy khi phương thức không phải GET: gửi lại biểu mẫu, endpoint API, đích webhook, chuyển giao POST cho thanh toán hoặc xác thực. Đặc tả bảo đảm phương thức và body, nhưng không tự xác định mọi hành vi header, thông tin xác thực hoặc khác origin khi phát lại; hãy kiểm tra client thật thay vì giả định giống từng byte. Bài riêng về 302 với 307 phân tích trực tiếp hai mã; bài này tập trung vào điểm độc đáo của 307.

302, 303 và 307 trong một bảng

Cả ba nằm trong nhóm “tạm thời” của RFC nhưng khác nhau trên hai trục quan trọng: giữ phương thức và cache.

Phương thức khi tự động chuyển hướngCó thể cache theo suy đoán?
302 FoundCó thể đổi POST thành GET do hành vi client lịch sử, không phải yêu cầu RFCKhông
303 See OtherChủ ý lấy đích bằng GET hoặc HEADKhông
307 Temporary RedirectKHÔNG ĐƯỢC đổi phương thứcKhông

Không mã nào trong ba mã mặc định có thể cache theo suy đoán. 307, giống 302 và 303, cần tín hiệu độ mới rõ như Cache-Control hoặc Expires trước khi cache lưu mà không hỏi lại.

Trường hợp 1 tiếp theo: Google xử lý 307 thật cho SEO

Câu trả lời ngắn: giống hệt 302. Tài liệu HTTP Status Codes của Google ghi hàng 307 là “Equivalent to 302 (bản dịch) «tương đương 302»; hàng 302 được kế thừa giải thích ý nghĩa:

“By default, Google’s crawlers follow the redirect, and Google systems use the redirect as a weak signal that the redirect target should be processed.” (bản dịch) «Theo mặc định, các crawler của Google đi theo chuyển hướng, còn hệ thống Google dùng chính chuyển hướng làm tín hiệu yếu rằng đích của chuyển hướng nên được xử lý.»

“Yếu” là từ chủ chốt: chuyển hướng tạm thời không hợp nhất canonical hóa vào đích như chuyển hướng vĩnh viễn. Tài liệu Redirects and Google Search xếp 302, 303 và 307 chung nhóm “tạm thời” và nói: “Googlebot follows the redirect, but the indexing pipeline doesn’t use the redirect as a signal that the redirect target should be canonical.” (bản dịch) «Googlebot theo chuyển hướng nhưng pipeline lập chỉ mục không dùng chuyển hướng làm tín hiệu rằng đích nên là canonical.» Cùng trang khuyên dùng chuyển hướng tạm thời khi chỉ muốn tạm đưa người dùng đến trang khác. Evidence for this claim Google's indexing pipeline does not use a temporary 302, 303, or 307 redirect as a signal that the redirect target should be canonical. Scope: redirect crawling, indexing, and canonicalization Confidence: high · Verified: Redirects and Google Search

Ngay sau các hàng 307 và 308, Google thêm lưu ý đáng ghi nhớ:

“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ã trạng thái này theo cùng một cách, hãy nhớ rằng chúng khác nhau về ngữ nghĩa. Hãy dùng mã trạng thái phù hợp với chuyển hướng để các client khác, chẳng hạn thiết bị đọc sách và công cụ tìm kiếm khác, cũng có thể hưởng lợi.»

Vì vậy, Google xếp 307 và 302 cùng nhóm về xếp hạng nhưng vẫn yêu cầu chọn mã đúng ngữ nghĩa. Đó là toàn bộ câu trả lời SEO. Evidence for this claim Google treats 307 as equivalent to 302 for Search while noting that the HTTP semantics differ. Scope: Google Search redirect handling; clients still need the semantically appropriate status code. Confidence: high · Verified: Google: HTTP status codes and Search John Mueller còn nói thẳng hơn trong tập 51 Search Off the Record “Bàn về chuyển hướng”: 307/308 cũng chuyển tiếp yêu cầu POST, khác 301/302 thường chuyển tiếp GET, rồi kết luận:

“I think for SEO, it doesn’t really matter. It’s more like, I don’t know… Does it work for APIs or not? And usually, APIs are not something that you need to have indexed directly in Search.” (bản dịch) «Tôi nghĩ đối với SEO, điều đó không thực sự quan trọng. Vấn đề giống như câu hỏi nó có hoạt động cho API hay không; và thông thường API không phải thứ bạn cần lập chỉ mục trực tiếp trong Search.»

Đổi chuyển hướng tạm thời sang 307 không đem lại lợi thế xếp hạng. Lý do hợp lệ duy nhất để chọn nó là giữ phương thức/body hoặc một ưu tiên nhất quán cho tương lai được trình bày ở cuối.

Trường hợp 1 tiếp theo: mặc định framework và CDN

Nhiều câu hỏi “vì sao đây là 307?” đến từ mặc định framework chứ không phải lựa chọn chủ ý. Hàm redirect() của Next.js mặc định dùng 307; tài liệu giải thích dưới tiêu đề “Why does redirect use 307 and 308?” rằng “The redirect() method uses a 307 by default, instead of a 302 temporary redirect, meaning your requests will always be preserved as POST requests.” (bản dịch) «redirect() mặc định dùng 307 thay cho 302 tạm thời, nghĩa là yêu cầu luôn được giữ dưới dạng POST.» Next.js dùng 303 riêng trong Server Actions và có permanentRedirect() cho 308. Nếu thấy 307 mình không viết, hãy kiểm tra mặc định của framework hoặc edge platform cho chuyển hướng không phải GET; đó thường là nguyên nhân và thường đúng.

Trường hợp 2: “307 ảo” HSTS mà máy chủ không gửi

Đây là phần ít được trình bày đầy đủ. Khi site gửi header Strict-Transport-Security (HSTS), nó yêu cầu trình duyệt từ nay chỉ tải qua https. Ở yêu cầu tiếp theo đến phiên bản http, trình duyệt tự nâng lên https mà không liên hệ máy chủ rồi hiển thị lần nâng nội bộ như “307” trong DevTools và một số crawler.

John Mueller giải thích cơ chế trên trang cá nhân:

“After seeing the HTTPS URL with the HSTS header (for example, with any redirect from the HTTP version), Chrome will act like it’s seeing a 307 redirect the next time you try to access the HTTP page. Your server’s not returning a 307, Chrome is just showing it to you as such to explain that it’s doing the redirect for you.” (bản dịch) «Sau khi thấy URL HTTPS mang header HSTS, chẳng hạn qua bất kỳ chuyển hướng nào từ phiên bản HTTP, Chrome sẽ hành xử như thể gặp chuyển hướng 307 vào lần tiếp theo bạn truy cập trang HTTP. Máy chủ của bạn không trả về 307; Chrome chỉ hiển thị mã đó để giải thích rằng chính trình duyệt đang thực hiện chuyển hướng thay cho bạn.»

Body 0 byte là dấu hiệu. Mueller nói thêm “the 307 isn’t actually a redirect at all, it’s just a placeholder.” (bản dịch) «307 thật ra hoàn toàn không phải chuyển hướng, chỉ là chỗ giữ chỗ». Hướng dẫn chuyển hướng của tôi giải thích hệ quả khi audit: “When web servers require clients to only use HTTPS connections (HSTS policy), Google won’t see the 307 because it’s cached in the browser. The initial hit (without cache) will have a server response code that’s likely a 301 or a 302. But your browser will show you a 307 for subsequent requests which makes it more difficult to troubleshoot. You will need to use a fresh Incognito session to see the returned status code.” (bản dịch) «Khi máy chủ buộc client chỉ dùng HTTPS, Google không thấy 307 vì nó được cache trong trình duyệt. Lần truy cập đầu không cache thường nhận 301 hoặc 302 từ máy chủ, nhưng trình duyệt hiển thị 307 cho lần sau. Cần phiên ẩn danh mới để xem mã thật.»

Googlebot thật sự thấy gì với HSTS

Hai phát biểu Google cách nhau 5 năm cần đọc cùng nhau. Tháng 12/2015, Zineb Ait Bahajji nói qua Search Engine Roundtable: “With HSTS implemented, Googlebot sees a 301 redirect (try it with Fetch as Google). The 307 is just an ‘internal redirect’.” (bản dịch) «Khi triển khai HSTS, Googlebot thấy chuyển hướng 301; 307 chỉ là chuyển hướng nội bộ.» Đến tháng 10/2020, Mueller nói trong video Ask Google Webmasters được Search Engine Journal dẫn lại: “In short, [Googlebot] doesn’t interact with them. 307 redirects are generally not real redirects.” (bản dịch) «Nói ngắn gọn, Googlebot không tương tác với chúng; chuyển hướng 307 thường không phải chuyển hướng thật.» Dù cách diễn đạt khác nhau, crawler không thấy cùng “307” con người thấy trong DevTools. Công cụ crawl đã thay đổi, nhưng điểm nền tảng vẫn giữ: trường hợp HSTS không có 307 do máy chủ phát. Hãy coi phát biểu 2020 là hướng dẫn hiện hành và 2015 là lịch sử hữu ích.

Kết luận vận hành: HSTS là tiện ích trình duyệt, không phải cơ chế khám phá crawl. Chủ site vẫn cần chuyển hướng thật ở máy chủ, thường là 301, cho http→https nếu muốn crawler đi được đường đó.

Bing xử lý 307 thế nào

Thành thật mà nói, có khoảng trống tài liệu. Tôi không tìm thấy phát biểu công khai của Bing nêu đích danh 307 hoặc 307 do HSTS. Hướng dẫn chuyển hướng của Bing, gồm bài năm 2011 về 301/302/canonical và bài năm 2020 về di chuyển website, chỉ nói phân biệt vĩnh viễn với tạm thời của 301/302; không nhắc 307, 308 hay HSTS. Vì vậy đừng giả định Bing giống Google: Bing chưa công bố điều gì riêng cho 307. Hiện tượng vẫn có thật và liên quan crawler; SEO Spider của Screaming Frog có tùy chọn “Respect HSTS Policy” chính vì HSTS ảnh hưởng crawl, nhưng đó là tài liệu công cụ, không phải phát biểu Bing.

Khi nào nên chủ ý chọn 307

Chọn 307 thay 302 khi việc mất phương thức hoặc body ban đầu sẽ làm hỏng quy trình:

  • Endpoint API và đích webhook nhận POST/PUT/PATCH.
  • Luồng gửi biểu mẫu POST chuyển hướng sau xử lý.
  • Chuyển giao POST thanh toán hoặc đăng nhập giữa các host.
  • Mọi yêu cầu có body không thể bị bỏ.

Với lần chuyển trang thông thường, Google không phân biệt 302 và 307 về SEO nên mã nào cũng được. Phiên bản vĩnh viễn của logic giữ phương thức này là quan hệ 301 với 308: 308 đối với 301 giống như 307 đối với 302.

Quan điểm của tôi trong hướng dẫn chuyển hướng rõ hơn câu “không quan trọng”: “my preferred order would be: 307 / 302 / 303 > Meta refresh 0 / HTTP refresh 0.” (bản dịch) «thứ tự tôi ưu tiên là 307 / 302 / 303 trước Meta refresh 0 / HTTP refresh 0». Tôi đặt 307 đầu tiên trong các lựa chọn tạm thời vì dùng nhất quán sẽ an toàn về giữ phương thức, gần với lập luận “đầy đủ” của Mueller. Dù chọn mã nào, hãy tránh để 307 thật hoặc dấu vết HSTS trở thành một hop trong chuỗi dài; mỗi hop tăng độ trễ và giảm hiệu quả.

Try it live

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

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.