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.
Ngôn ngữ
1 tín hiệu bằng chứng trên trang này
- Công cụ trực tuyến liên quanHTTP Status & Redirect Checker
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, giống 302: tạm đưa người dùng và công cụ tìm kiếm đến URL mới mà không yêu cầu Google chuyển tín hiệu xếp hạng của URL cũ sang URL mới. Điểm khác duy nhất là 307 cam kết không đổi loại yêu cầu. Nếu người dùng gửi biểu mẫu bằng POST, yêu cầu sau chuyển hướng vẫn là POST. Với liên kết trang thông thường, khác biệt này không nhìn thấy; nó chỉ quan trọng cho biểu mẫu và ứng dụng. Còn “307” đôi khi xuất hiện khi trình duyệt nâng cấp sang https hoàn toàn không phải chuyển hướng thật.
Chuyển hướng 307 là gì
Khi một URL chuyển sang nơi khác tạm thời, máy chủ có thể trả 307 Temporary Redirect và trỏ trình duyệt đến vị trí mới. Ý tưởng cơ bản giống 302: vì chỉ tạm thời, Google không coi đó là tín hiệu chuyển thứ hạng của URL gốc sang URL mới như với chuyển hướng vĩnh viễn. Đây là tín hiệu yếu, không canonical hóa, chứ không bảo đảm URL gốc giữ nguyên thứ hạng hoặc mãi được lập chỉ mục. 307 phù hợp với trang bảo trì, chiến dịch theo mùa hoặc trường hợp sẽ chuyển lại sau. 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
Điểm khác giữa 307 và 302
Chỉ có một khác biệt và phần lớn người dùng không gặp. Yêu cầu web có một phương thức: thường là GET để lấy trang, đôi khi là POST để gửi dữ liệu như biểu mẫu. 307 bảo đảm trình duyệt giữ cùng phương thức khi theo chuyển hướng. Client cũ đôi lúc đổi POST thành GET với 302 và làm hỏng lần gửi biểu mẫu; 307 loại bỏ rủi ro đó bằng quy tắc giao thức. 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
Với phần lớn chuyển hướng trang mà người dùng truy cập qua liên kết, điều này không tạo khác biệt vì cả hai phía đều dùng GET.
307 có hại cho SEO không?
Không. Tài liệu Google nói 307 “equivalent to” (bản dịch) «tương đương với» 302. Cả hai đều tạm thời nên không chuyển thứ hạng của trang cũ sang trang mới như 301 vĩnh viễn. Không có hình phạt hay lợi ích bí mật; Google xử lý 307 giống 302.
“307” không phải chuyển hướng
Đây là phần dễ gây nhầm. Nếu site buộc https bằng HSTS, trình duyệt đôi khi hiển thị “307” trong DevTools khi bạn truy cập phiên bản http. Máy chủ không gửi mã đó; trình duyệt tự tạo nhãn để giải thích việc nó chuyển thẳng sang phiên bản bảo mật. Phản hồi 0 byte là dấu hiệu nhận biết.
Vì vậy, đừng vội kết luận máy chủ cấu hình sai khi công cụ audit hoặc trình duyệt báo 307 bất ngờ. Cửa sổ ẩn danh mới thường xóa trạng thái HSTS đã học và cho thấy mã thật, nhưng không phải lúc nào cũng vậy: một số tên miền nằm trong danh sách HSTS preload tích hợp của trình duyệt, trạng thái này không mất trong ẩn danh. Redirect checker hoặc yêu cầu curl đáng tin cậy hơn để xem máy chủ thật sự trả gì.
Muốn xem ngôn ngữ đặc tả, phát biểu của John Mueller, toàn bộ cơ chế HSTS và cách trả 307 thật? Hãy chuyển sang thẻ Nâng cao.
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 đương302», 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ố:
- 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.
- 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:
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“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.»
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
307and302is that307guarantees that the client will not change the request method and body when the redirected request is made. With302, older clients incorrectly changed the method toGET.307and302responses are identical when the request method isGET.” (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.
| Mã | Phương thức khi tự động chuyển hướng | Có thể cache theo suy đoán? |
|---|---|---|
| 302 Found | Có thể đổi POST thành GET do hành vi client lịch sử, không phải yêu cầu RFC | Không |
| 303 See Other | Chủ ý lấy đích bằng GET hoặc HEAD | Không |
| 307 Temporary Redirect | KHÔNG ĐƯỢC đổi phương thức | Khô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ả.
Tóm tắt cho AI
Bản cô đọng của phần Nâng cao:
- 307 có hai trường hợp không liên quan: chuyển hướng tạm thời thật do máy chủ phát, giữ phương thức/body HTTP; và dấu vết HSTS trong trình duyệt, “307” 0 byte mà máy chủ không gửi khi trình duyệt tự nâng http→https.
- Bảo đảm đặc tả: RFC 9110 nói 307 “MUST NOT change the request method.” (bản dịch) «KHÔNG ĐƯỢC đổi phương thức». MDN nói “307 and 302 responses are identical when the request method is GET” (bản dịch) «phản hồi 307 và 302 giống nhau khi phương thức yêu cầu là GET», nên khác biệt chỉ quan trọng cho POST/PUT/PATCH, biểu mẫu và API. Bảo đảm bao trùm phương thức/body; header, thông tin xác thực và khác origin vẫn phụ thuộc client.
- 302/303/307: 302 có thể đổi POST sang GET do lịch sử, 303 chủ ý lấy đích bằng GET/HEAD, 307 không được đổi phương thức; không mã nào mặc định có thể cache theo suy đoán.
- SEO: Google ghi 307 “Equivalent to
302” (bản dịch) «tương đương302», một tín hiệu tạm thời yếu không hợp nhất vào đích. Mueller nói với SEO “it doesn’t really matter” (bản dịch) «không thực sự quan trọng»; câu hỏi thật là API có hoạt động không. - Mặc định framework: Next.js
redirect()mặc định dùng 307, dùng 303 trong Server Actions vàpermanentRedirect()cho 308, để giữ POST. - HSTS: trình duyệt hiển thị 307 với body 0 byte; mã máy chủ thật thường là 301/302. Googlebot không thấy 307 đó. Vẫn cần 301 thật ở máy chủ cho http→https. Kiểm tra bằng redirect checker hoặc
curl; ẩn danh thường hữu ích nhưng không vượt qua danh sách HSTS preload. - Bing: không có phát biểu công khai riêng cho 307; đây là khoảng trống tài liệu, không phải bằng chứng tương đương.
- Ưu tiên: không có lý do xếp hạng để đổi sang 307; thứ tự của Patrick đặt 307 đầu trong các lựa chọn tạm thời để bảo toàn phương thức.
Tài liệu chính thức
Tài liệu nguồn sơ cấp và đặc tả.
- Mã trạng thái HTTP, lỗi mạng, DNS và Google Search — hàng “307 (temporary redirect) — Equivalent to
302”, cách nói “tín hiệu yếu” của 302 và lưu ý khác biệt ngữ nghĩa. - Chuyển hướng và Google Search — xếp 302/303/307 vào nhóm “tạm thời”; 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.
Bing / Microsoft
- Quản lý chuyển hướng — 301, 302 và canonical — hướng dẫn Bing chỉ nói 301/302, không nhắc 307/HSTS.
- Di chuyển website với Bing — hướng dẫn di chuyển cũng chỉ nói 301/302.
Đặc tả HTTP
- RFC 9110 §15.4.8 — 307 Temporary Redirect — quy tắc “MUST NOT change the request method” (bản dịch) «KHÔNG ĐƯỢC đổi phương thức yêu cầu».
- RFC 9110 §15.4.3 — 302 Found — ghi chú lịch sử POST→GET dẫn sang 307.
Tham chiếu kỹ thuật
- MDN — 307 Temporary Redirect — giữ phương thức/body và giống nhau khi phương thức là GET.
Framework
- Next.js — tham chiếu hàm
redirect()— FAQ giải thích vì saoredirectdùng 307 và 308; mặc định 307, riêng Server Actions dùng 303.
Công cụ crawler
- Screaming Frog — Hướng dẫn SEO crawl HSTS và chuyển hướng 307 — cấu hình “Respect HSTS Policy” và cơ chế HSTS.
Trích dẫn từ nguồn
Các phát biểu được ghi nhận; mỗi liên kết dẫn đến hoặc ghi nhận đoạn được trích.
Tài liệu Google — cách xử lý SEO
- “307 (temporary redirect) — Equivalent to
302.” (bản dịch) «307 (chuyển hướng tạm thời) — tương đương302.» — Google Search Central, Mã trạng thái HTTP, lỗi mạng, DNS và Google Search. Đi đến trích dẫn - “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, crawler Google theo chuyển hướng và hệ thống Google dùng nó như tín hiệu yếu rằng đích nên được xử lý.» Đây là hàng 302 mà 307 kế thừa. Đi đến trích dẫn
- “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 về ngữ nghĩa và dùng mã phù hợp để client khác cũng hưởng lợi.» Đi đến trích dẫn
- “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 nó làm tín hiệu rằng đích nên là canonical.» — Google Search Central, Chuyển hướng và Google Search. Đi đến trích dẫn
Đặc tả HTTP / MDN — bảo đảm kỹ thuật
- “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ã 307 cho biết tài nguyên đích tạm nằm dưới URI khác và user agent KHÔNG ĐƯỢC đổi phương thức khi tự động chuyển hướng.» — RFC 9110, §15.4.8. Đọc mục này
- “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 POST thành GET cho yêu cầu sau; nếu không muốn, có thể dùng 307.» — RFC 9110, §15.4.3, mục 302. Đọc mục này
- “The difference between
307and302is that307guarantees that the client will not change the request method and body when the redirected request is made…307and302responses are identical when the request method isGET.” (bản dịch) «307 bảo đảm client không đổi phương thức và body; phản hồi 307 và 302 giống nhau khi phương thức là GET.» — MDN, 307 Temporary Redirect. Đi đến trích dẫn
John Mueller, Google — SEO và việc giữ phương thức
- “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) «Với SEO, điều đó không thực sự quan trọng; câu hỏi là API có hoạt động không, mà API thường không cần được lập chỉ mục trực tiếp.» — Search Off the Record, tập 51, “Bàn về chuyển hướng”, 17/11/2022. PDF bản ghi
- “And with 307, 308, it also forwards POST requests” (bản dịch) «Với 307 và 308, nó cũng chuyển tiếp yêu cầu POST», khác 301/302 thường chuyển tiếp GET. — Cùng tập.
John Mueller, Google — “307 ảo” HSTS
- “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… the 307 isn’t actually a redirect at all, it’s just a placeholder.” (bản dịch) «Máy chủ không trả 307; Chrome chỉ hiển thị như vậy để giải thích nó tự chuyển hướng… 307 không phải chuyển hướng thật, chỉ là chỗ giữ chỗ.» — John Mueller, HTTPS & HSTS: 301, 302, or 307?, johnmu.com, tháng 06/2016. Đi đến trích dẫn
- “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.» — John Mueller, Ask Google Webmasters, tháng 10/2020, qua Search Engine Journal. Đi đến trích dẫn
Zineb Ait Bahajji, Google — HSTS năm 2015, qua nguồn dẫn lại
- “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ộ.» — Zineb Ait Bahajji tại Google, qua Twitter, được Search Engine Roundtable đưa tin tháng 12/2015. Đi đến trích dẫn
Tôi đang nhìn thấy loại 307 nào?
Gần như mọi câu hỏi về 307 đều thuộc một trong hai trường hợp hoàn toàn khác nhau. Hãy đi theo cây quyết định.
Diagnosing a 307 you didn't expect
Quan niệm sai và lỗi cần tránh
“307 không truyền giá trị liên kết như 302.” Cách nói “307 tệ hơn 302” là sai và đang xuất hiện trên các blog SEO lớn. Tài liệu Google xử lý 307 và 302 giống nhau: cả hai là chuyển hướng tạm thời, tín hiệu yếu và không canonical hóa; tài liệu HTTP Status Codes nói thẳng 307 “Equivalent to 302” (bản dịch) «tương đương 302». Không có cơ sở được ghi nhận để nói riêng 307 truyền ít hơn 302. Quan điểm đúng của Google là chuyển hướng tạm thời nói chung không nhằm hợp nhất tín hiệu xếp hạng vào đích như chuyển hướng vĩnh viễn; đừng để tuyên bố “307 giữ lại equity” thúc đẩy thay đổi vô ích.
“307 trong bảng Network nghĩa là máy chủ cấu hình sai chuyển hướng.” Thường không đúng. Nếu HSTS đã bật và trình duyệt từng thấy Strict-Transport-Security, nó hiển thị lần nâng http→https như 307 để tự giải thích; máy chủ không trả mã đó và body 0 byte là dấu hiệu. Phiên ẩn danh mới thường cho thấy mã thật, nhưng không áp dụng với tên miền trong danh sách HSTS preload. Với các tên miền đó, dùng redirect checker hoặc curl không cấu hình HSTS trước khi đi tìm một lỗi không tồn tại.
“Googlebot thấy cùng 307 mà trình duyệt hiển thị trên site HSTS.” Không hẳn. Đại diện Google từng nói Googlebot thấy 301 (Zineb, 2015) hoặc không tương tác với cơ chế 307/HSTS (Mueller, 2020). Dù cách nào, đó không phải “307” con người thấy. Vẫn cần 301 thật ở máy chủ cho http→https nếu việc crawler khám phá đường đó quan trọng.
“303 và 307 về cơ bản có thể thay thế nhau.” Chúng đối nghịch trên trục quan trọng nhất. 303 luôn chuyển phương thức sang GET trong mẫu Post/Redirect/Get; 307 bảo đảm không đổi phương thức. Chúng chỉ dễ bị nhầm vì cùng thuộc nhóm tạm thời cạnh 302.
“Hãy đổi mọi chuyển hướng tạm thời sang 307 để tăng thứ hạng.” Không có lợi ích đó. Chỉ nên ưu tiên 307 hơn 302 khi thật sự cần giữ phương thức/body hoặc muốn nhất quán cho tương lai. Đổi hàng loạt 302 sang 307 không đem lại gì và có thể tạo lỗi.
“302 luôn đổi POST thành GET nên hoàn toàn hỏng với biểu mẫu.” Đây là cách nói quá. Việc đổi POST→GET từng là vấn đề thật của client cũ không nhất quán, nên 307 được tạo làm lựa chọn có bảo đảm. Trình duyệt hiện đại nhất quán hơn nhiều. 307 loại bỏ sự mơ hồ bằng đặc tả, không có nghĩa 302 “hỏng”.
Xem mã trạng thái thật, không phải dấu vết HSTS
Khi HSTS đã cache, trình duyệt che 301/302 thật sau 307 ảo. curl mặc định không áp dụng HSTS nên lệnh thông thường nói thẳng với máy chủ và cho thấy sự thật. Đừng chạy với file cache --hsts, nếu không bạn lại đưa vào phép thử chính việc viết lại phía client cần loại trừ.
Theo dõi toàn bộ chuỗi chuyển hướng, chỉ lấy header
# -s silent, -I headers-only, -L follow redirects, cap the hops
curl -sIL --max-redirs 10 http://example.com/old-page 2>&1 \
| grep -Ei '^(HTTP/|location:)'
# Each "HTTP/…" line is one hop's real status code; each "location:" is where it points.
# An HSTS "307" never appears here — it's browser-only.Kiểm tra mã của một URL mà không theo chuyển hướng
curl -s -o /dev/null -w "%{http_code}\n" http://example.com/old-pageConsole Chrome DevTools — nhận diện 307 ảo
Dán vào thẻ Console. Chuyển hướng thật từ máy chủ hiển thị cờ redirected và URL đã phân giải; lần nâng HSTS xảy ra trước khi yêu cầu rời trình duyệt.
// Fetch and report what the network actually did.
fetch("http://example.com/old-page", { redirect: "manual" })
.then(r => console.log("type:", r.type, "status:", r.status, "url:", r.url))
.catch(e => console.log("blocked before request (often HSTS upgrade):", e.message));Bạn cũng có thể đọc bản ghi HSTS của Chrome tại chrome://net-internals/#hsts: truy vấn tên miền để xem static_upgrade_mode/dynamic_upgrade_mode có đang buộc https hay không. Đó là nguồn của 307 trong bảng Network.
Bookmarklet — xem nhanh header của thẻ hiện tại
Tạo bookmark với đoạn này làm URL rồi nhấp trên trang để ghi trạng thái URL hiện tại và tình trạng chuyển hướng vào Console:
javascript:(function(){fetch(location.href,{redirect:"manual"}).then(function(r){console.log("[status]",r.status,"[type]",r.type,"[redirected]",r.redirected,"[url]",r.url);}).catch(function(e){console.log("[error]",e.message);});})();Lưu ý: fetch() trong trình duyệt không đọc được body chuyển hướng opaque khác origin. Để theo dõi nhiều hop có thẩm quyền, curl -sIL ở trên là chuẩn đối chiếu.
Trả về 307 thật
Lý do trả 307 thay vì để framework tự mặc định là bảo đảm phương thức và body được giữ. Dưới đây là một số cách thông dụng để khai báo rõ.
Apache (.htaccess)
# mod_rewrite with an explicit 307 (R=307). Preserves POST body.
RewriteEngine On
RewriteRule ^old-endpoint$ https://example.com/new-endpoint [R=307,L]nginx
# 307 keeps the method; 302 would risk POST→GET on older clients.
location = /old-endpoint {
return 307 https://example.com/new-endpoint;
}Node / Express
app.post("/old-endpoint", (req, res) => {
// res.redirect defaults to 302; pass 307 to preserve the POST + body.
res.redirect(307, "https://example.com/new-endpoint");
});Next.js (App Router) — 307 là mặc định nên thường không cần tự viết mã:
import { redirect } from "next/navigation";
// redirect() returns a 307 by default (303 inside a Server Action),
// preserving the request as a POST. Use permanentRedirect() for a 308.
export default function Page() {
redirect("/new-endpoint");
}Phản hồi 307 thô trông thế nào
HTTP/1.1 307 Temporary Redirect
Location: https://example.com/new-endpoint
Content-Length: 0“307 ảo” HSTS trông thế nào trong trình duyệt
Cùng dòng trạng thái trong DevTools, nhưng các dấu hiệu cho thấy nó đến từ trình duyệt chứ không phải máy chủ và có body 0 byte:
HTTP/1.1 307 Internal Redirect
Location: https://example.com/old-page
Non-Authoritative-Reason: HSTSNếu thấy Non-Authoritative-Reason: HSTS trong Chrome hoặc “307” 0 byte biến mất khi thử bằng client không áp dụng HSTS, đó là dấu vết chứ không phải chuyển hướng máy chủ. Tên header và nhãn DevTools chính xác là chi tiết triển khai riêng của Chrome, không phải bảo đảm trong đặc tả HTTP hay HSTS; chỉ dùng để minh họa, đừng xây automation dựa trên chúng cho mọi trình duyệt hoặc phiên bản.
Phương thức, thời lượng và nguồn tạo
Tôi đánh giá 307 trên ba trục trước khi thay đổi:
- Phương thức: đích có phải nhận phương thức và body gốc không? Nếu có, 307 là chuyển hướng tạm thời giữ cả hai. Lần chuyển trang
GETthông thường hiếm khi cần thuộc tính này. - Thời lượng: lần chuyển có thật sự tạm thời không? Chỉ giữ 307 khi URL gốc dự kiến quay lại. Lần chuyển vĩnh viễn cần quyết định chuyển hướng vĩnh viễn, không phải trạng thái tạm thời vô hạn.
- Nguồn: máy chủ gửi 307, framework chọn nó hay trình duyệt tổng hợp lần nâng HSTS nội bộ? “Internal Redirect” trong DevTools không phải quy tắc origin cần viết lại.
Công cụ phân biệt 307 thật và ảo
- Redirect Checker: xem trạng thái máy chủ có thể quan sát, đích và từng hop mà không dựa vào trạng thái HSTS của một trình duyệt.
- Redirect Chain Mapper: xem từng hop khi 307 nằm trong đường chuyển hướng dài.
- HTTP Header Checker: kiểm tra
Location,Strict-Transport-Securityvà so sánh dấu vết edge với origin. - curl: chạy
curl -I http://example.com/pathngoài cách hiển thị HSTS nội bộ của trình duyệt. Chỉ kiểm tra giữ POST trên endpoint an toàn do bạn kiểm soát. - Browser DevTools: xem mục có ghi “Internal Redirect” và truyền 0 byte hay không; đó là dấu hiệu lần nâng HSTS do trình duyệt tạo.
Xác minh 307 sau triển khai
Kiểm thử trạng thái và đích
Cách thử: kiểm tra nguồn bằng Redirect Checker hoặc curl -I. Kết quả mong đợi: một 307 với Location dự kiến. Diễn giải khi thất bại: tầng khác đã đổi quy tắc hoặc đích. Thời gian theo dõi: ngay lập tức. Điều kiện rollback: xuất hiện vòng lặp, đích hỏng hoặc hostname ngoài ý muốn.
Kiểm thử giữ phương thức
Cách thử: gửi POST vô hại đến route thử nghiệm được kiểm soát và xem đích nhận gì. Kết quả mong đợi: đích nhận POST cùng body gốc. Diễn giải khi thất bại: tầng trung gian đổi phương thức hoặc phục vụ mã khác. Thời gian theo dõi: ngay lập tức. Điều kiện rollback: biểu mẫu, webhook hoặc thanh toán mất phương thức hay body.
Kiểm thử tách HSTS
Cách thử: so DevTools hoặc phiên ẩn danh mới với curl -I không có cache HSTS. Kết quả mong đợi: “Internal Redirect” của trình duyệt được phân biệt với phản hồi thật và HTTP vẫn có chuyển hướng máy chủ. Diễn giải khi thất bại: HSTS đang che quy tắc origin bị thiếu; lưu ý ẩn danh không đủ với tên miền trong danh sách HSTS preload. Thời gian theo dõi: ngay lập tức. Điều kiện rollback: thay đổi origin làm mất chuyển hướng HTTP sang HTTPS đang hoạt động.
Tự kiểm tra: 307 Temporary Redirect
Năm câu hỏi nhanh về 307, cách Google xử lý và dấu vết HSTS. Chọn đáp án cho từng câu rồi kiểm tra.
Tài nguyên đáng xem
Bài viết liên quan của tôi
- 11 loại chuyển hướng và tác động SEO — nguồn của định nghĩa 307, lưu ý HSTS và thứ tự ưu tiên 307 / 302 / 303.
- Mã trạng thái HTTP và tác động SEO — bài có hai mục 307 riêng: chuyển hướng tạm thời và chính sách HSTS.
- Hướng dẫn nhập môn Technical SEO — vị trí của chuyển hướng trong bức tranh lớn.
Bài nói của tôi
- Cách Search hoạt động trên SlideShare — phần trình bày về crawl, render, lập chỉ mục, xếp hạng và cách xử lý chuyển hướng. Tuyên bố giới hạn thường trực của tôi vẫn áp dụng: “This is my understanding of systems… not going to be 100% complete or accurate.” (bản dịch) «Đây là hiểu biết của tôi về các hệ thống… không thể đầy đủ hoặc chính xác 100%.»
Tài nguyên trong ngành
- John Mueller — HTTPS & HSTS: 301, 302 hay 307? — lời giải thích trực tiếp rõ nhất về “307 ảo” HSTS, gồm câu máy chủ không trả mã 307 nói trên.
- Search Off the Record, tập 51 — “Bàn về chuyển hướng” — Mueller và Splitt nói vì sao 307/308 tồn tại và vì sao với SEO điều đó không thực sự quan trọng.
- Google về chuyển hướng 307/HSTS — tóm tắt video Mueller nói chuyển hướng 307 thường không phải chuyển hướng thật.
- Googlebot coi 307 như 301? — phát biểu năm 2015 của Zineb Ait Bahajji về HSTS.
- MDN — 307 Temporary Redirect — tham chiếu kỹ thuật cho bảo đảm phương thức/body.
- Screaming Frog — Hướng dẫn SEO crawl HSTS và 307 — hướng dẫn cấu hình crawler tốt nhất cho 307 do HSTS.
- Next.js — tham chiếu
redirect()— lý do framework lớn mặc định chuyển hướng không phải GET sang 307.
Nhật ký thay đổi
Đã cập nhật 22 thg 8, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.
Đã cập nhật 9 thg 8, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.
Đã cập nhật 8 thg 8, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.
Đã cập nhật 17 thg 7, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.
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.