Sự khác biệt giữa mã trạng thái HTTP 301 và 308 là gì?


138

Sự khác biệt giữa HTTP 301308mã trạng thái là gì?

  • 301 (Đã di chuyển vĩnh viễn): Yêu cầu này và tất cả các yêu cầu trong tương lai phải được chuyển hướng đến URI đã cho.

  • 308 (Chuyển hướng vĩnh viễn): Yêu cầu và tất cả các yêu cầu trong tương lai phải được lặp lại bằng cách sử dụng một URI khác.

Chúng có vẻ giống nhau.


Không có mã 308 trong tools.ietf.org/html/rfc2616tools.ietf.org/html/rfc6585 , vì vậy câu hỏi phải được giải quyết cho người phát minh ra mã không chuẩn này.
KonstantinL

4
Có đặc điểm kỹ thuật RFC 7538, do đó nó là mã HTTP thực
Alexander Drobyshevsky

2
Chà, tools.ietf.org/html/rfc7538 : Lưu ý: Mã trạng thái này tương tự như 301, ngoại trừ việc nó không cho phép thay đổi phương thức yêu cầu từ POST thành GET.
KonstantinL

4
Không sử dụng RFC 2616 làm tài liệu tham khảo. Nó đã bị che khuất bởi RFCs 7230-35.
cassiomolin

Câu trả lời:


258

Tổng quan về 301, 302307

Các RFC 7231 , các tài liệu tham khảo hiện hành đối với ngữ nghĩa và nội dung của giao thức HTTP 1.1 /, định nghĩa 301(Moved Permanently) và 302mã trạng thái (Found), cho phép các phương thức yêu cầu phải được thay đổi từ POSTtới GET. Đặc tả này cũng xác định 307mã trạng thái (Chuyển hướng tạm thời) không cho phép phương thức yêu cầu được thay đổi từ POSTthành GET.

Xem thêm chi tiết bên dưới:

6.4.2. 301 Đã di chuyển vĩnh viễn

Các 301(Moved Permanently) mã trạng thái chỉ ra rằng tài nguyên mục tiêu đã được chỉ định một vĩnh viễn URI mới và bất kỳ tài liệu tham khảo trong tương lai để cập khu vực này phải sử dụng một trong các URI kèm theo. [...]

Lưu ý: Vì lý do lịch sử, tác nhân người dùng CÓ THỂ thay đổi phương thức yêu cầu từ POSTthành GETcho yêu cầu tiếp theo. Nếu hành vi này là không mong muốn, 307mã trạng thái (Chuyển hướng tạm thời) có thể được sử dụng để thay thế.

6.4.3. 302 Tìm thấy

Các 302(Found) mã trạng thái chỉ ra rằng tài nguyên mục tiêu tạm thời nằm dưới một URI khác nhau. Vì đôi khi chuyển hướng có thể bị thay đổi, nên khách hàng phải tiếp tục sử dụng URI yêu cầu hiệu quả cho các yêu cầu trong tương lai. [...]

Lưu ý: Vì lý do lịch sử, tác nhân người dùng CÓ THỂ thay đổi phương thức yêu cầu từ POSTthành GETcho yêu cầu tiếp theo. Nếu hành vi này là không mong muốn, 307mã trạng thái (Chuyển hướng tạm thời) có thể được sử dụng để thay thế.

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

Các 307(Temporary Redirect) mã trạng thái chỉ ra rằng cư trú tài nguyên mục tiêu tạm thời dưới một URI khác nhau và user agent PHẢI KHÔNG thay đổi phương thức yêu cầu nếu nó thực hiện một chuyển hướng tự động để mà URI. Vì chuyển hướng có thể thay đổi theo thời gian, nên khách hàng phải tiếp tục sử dụng URI yêu cầu có hiệu lực ban đầu cho các yêu cầu trong tương lai. [...]

Lưu ý: Mã trạng thái này tương tự như 302(Đã tìm thấy), ngoại trừ việc nó không cho phép thay đổi phương thức yêu cầu từ POSTthành GET. Đặc điểm kỹ thuật này xác định không có đối tác tương đương nào cho 301(Đã chuyển vĩnh viễn) ( RFC 7238 , tuy nhiên, xác định mã trạng thái 308 (Chuyển hướng vĩnh viễn) cho mục đích này).

Nhu cầu về 308

Các RFC 7238 đã được tạo ra để xác định 308(Permanent Redirect) mã trạng thái, đó là tương tự như 301(Moved Permanently) nhưng không cho phép phương thức yêu cầu phải được thay đổi từ POSTtới GET.

Các 308mã trạng thái hiện nay được xác định bởi RFC 7538 (nghĩa lỗi thời các RFC 7238 ).

3. 308 Chuyển hướng vĩnh viễn

Các 308(Permanent Redirect) mã trạng thái chỉ ra rằng tài nguyên mục tiêu đã được chỉ định một vĩnh viễn URI mới và bất kỳ tài liệu tham khảo trong tương lai để cập khu vực này phải sử dụng một trong các URI kèm theo. Khách hàng có khả năng chỉnh sửa liên kết phải tự động liên kết lại các tham chiếu đến URI yêu cầu hiệu quả với một hoặc nhiều tham chiếu mới do máy chủ gửi, nếu có thể. [...]

Lưu ý: Mã trạng thái này tương tự như 301(Đã chuyển vĩnh viễn), ngoại trừ việc nó không cho phép thay đổi phương thức yêu cầu từ POSTsang GET.

Chúng tôi có những điều sau đây:

                                                             +-----------+-----------+
                                                             | Permanent | Temporary |
+------------------------------------------------------------+-----------+-----------+
| Allows changing the request method from POST to GET        | 301       | 302       |
+------------------------------------------------------------+-----------+-----------+
| Doesn't allow changing the request method from POST to GET | 308       | 307       |
+------------------------------------------------------------+-----------+-----------+

Chọn mã trạng thái phù hợp nhất

Michael Kropat đã tập hợp các biểu đồ quyết định giúp xác định mã trạng thái tốt nhất cho từng tình huống. Xem mã trạng thái 2xx3xxmã sau:

Chọn mã trạng thái 2xx hoặc 3xx


3
Cho rằng câu hỏi đặc biệt là về số phận giữa 301 và 308, bạn có thể giải thích thêm về: "không cho phép phương thức yêu cầu được thay đổi từ POSTthành GET" không? Nó có nghĩa là dat một biểu mẫu đã đăng không thể được xử lý, nhưng một biểu mẫu mới mới có thể là serverd và sau đó được đăng theo yêu cầu tiếp theo?
R. Schreurs

1
Đặc tả dự thảo này ( tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html ) đề xuất rằng các dịch vụ ReSTful nên sử dụng 308 ngay cả đối với GET. "KHÔNG NÊN sử dụng mã chuyển hướng HTTP 301-306 trừ khi nhà cung cấp dịch vụ biết máy khách trên thực tế là tác nhân người dùng." Tuy nhiên đây chỉ là bản nháp. Tôi không chắc liệu / khi nào nó sẽ được chấp nhận.
Bruce Adams

1
Bài đăng này, the-final-guide-to-get-vs-post , giải thích lý do tại sao cho phép một POSTyêu cầu (an toàn) được thay đổi thành một GET(không an toàn trong dữ liệu đó được chuyển bằng cách thêm nó vào url - và url có thể được lưu - bao gồm cả mật khẩu) yêu cầu có thể là một vấn đề bảo mật và nói chung nên tránh, trừ khi bạn biết cách thay đổi an toàn. Ngày nay, có vẻ như nó thường được hỗ trợ và ưu tiên sử dụng 307, 308 hơn 301, 302. Nhưng bạn nên xác minh.
SherylHohman

1
Mnemonic 308giống như một vô cực nằm ngang, vì vậy Chuyển hướng vĩnh viễn và cũng không bao giờ thay đổi Phương thức yêu cầu - nó cũng là một loại yêu cầu cố định, vĩnh viễn. Sau đó, 3071bước bên dưới - Phương pháp yêu cầu vĩnh viễn / lưu giữ (Nhận / Đăng), nhưng chuyển hướng đến một vị trí tạm thời: 7 - trông giống như "rẽ trái" hoặc đường vòng tạm thời và 7 cũng tương tự như k, vì vậy "giữ" phương thức yêu cầu.
SherylHohman

Bạn đã quên đề cập đến Resume Incomplete .
Knu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.