Sự khác biệt giữa các mã chuyển hướng HTTP


151

Sự khác biệt giữa các mã chuyển hướng HTTP 3XX khác nhau đối với tôi không rõ ràng. Vâng, tôi đã đọc thông số kỹ thuật, nhưng dường như có một số khác biệt giữa tiêu chuẩn và thực tế thực tế ở đây.

Các 301đang chuyển hướng dường như đủ rõ ràng: Đây có nghĩa là các tài nguyên đã được chuyển vĩnh viễn sang một URI, và các yêu cầu trong tương lai nên sử dụng URI.

307mã chuyển hướng cũng có vẻ rõ ràng: điều đó có nghĩa là chuyển hướng là tạm thời và các yêu cầu trong tương lai vẫn nên sử dụng URI gốc.

Nhưng tôi không thể biết sự khác biệt giữa 302303, hoặc tại sao một trong hai thực sự khác biệt 301. Có vẻ như 302ban đầu được dự định là một chuyển hướng tạm thời , (như 307), nhưng trong thực tế, hầu hết các trình duyệt đối xử với nó như một 303. Nhưng sự khác biệt giữa a 303và a là 301gì? Được 301cho là có nghĩa là chuyển hướng là lâu dài hơn ?

Câu trả lời:


139
  • 301 : Chuyển hướng vĩnh viễn. Khách hàng thực hiện các yêu cầu tiếp theo cho tài nguyên này nên sử dụng URI mới. Khách hàng không nên tự động theo dõi chuyển hướng cho các yêu cầu POST / PUT / DELETE.
  • 302 : Chuyển hướng cho lý do không xác định. Khách hàng thực hiện các yêu cầu tiếp theo cho tài nguyên này không nên sử dụng URI mới. Khách hàng không nên tự động theo dõi chuyển hướng cho các yêu cầu POST / PUT / DELETE.
  • 303 : Chuyển hướng cho lý do không xác định. Thông thường, 'Chiến dịch đã hoàn thành, tiếp tục ở nơi khác.' Khách hàng thực hiện các yêu cầu tiếp theo cho tài nguyên này không nên sử dụng URI mới. Khách hàng nên thực hiện theo chuyển hướng cho các yêu cầu POST / PUT / DELETE, nhưng sử dụng GET cho yêu cầu tiếp theo .
  • 307 : Chuyển hướng tạm thời. Tài nguyên có thể trở lại vị trí này sau đó. Khách hàng thực hiện các yêu cầu tiếp theo cho tài nguyên này nên sử dụng URI cũ. Khách hàng không nên tự động theo dõi chuyển hướng cho các yêu cầu POST / PUT / DELETE.

Cá nhân tôi khuyên bạn nên tránh 302 nếu bạn có sự lựa chọn. Nhiều khách hàng không tuân theo thông số kỹ thuật khi họ gặp 302. Đối với các chuyển hướng tạm thời, bạn nên sử dụng 303 hoặc 307, tùy thuộc vào loại hành vi bạn muốn đối với các yêu cầu không NHẬN. Thích 307 đến 303 trừ khi bạn cần hành vi thay thế trên POST / PUT / DELETE.


26
Không. Theo một 303 yêu cầu viết lại phương thức để NHẬN. Theo các phương pháp khác yêu cầu giữ phương thức, nhưng để xác nhận với UA nếu phương thức đó không an toàn (vì vậy các phương pháp khác ngoài TÙY CHỌN, TRƯỚC, NHẬN, ĐỀ NGHỊ ...)
Julian Reschke

1
@JulianReschke Bạn có thể vui lòng chỉ địa điểm trong thông số kỹ thuật sao lưu tuyên bố của bạn không?
Piotr Dobrogost

7
@BobAman Trong mô tả của bạn, bạn đang mắc phải những lỗi tương tự trong thông số HTTP gốc ( RFC 1945 ). Ví dụ, khách hàng nên thực hiện theo chuyển hướng cho các yêu cầu POST / PUT / DELETE. sau khi chuyển hướng 303 mà không chỉ định rằng động từ http được sử dụng trong yêu cầu sau phải được NHẬN là sai lệch ...
Piotr Dobrogost

2
Tự sửa lỗi: "Theo một 303 yêu cầu viết lại phương thức để NHẬN trừ khi phương thức ban đầu là CHÍNH".
Julian Reschke

2
Piotr: mặc định nên không thay đổi phương pháp; tài nguyên được di chuyển, điều đó không ảnh hưởng đến cách thao túng nó. 303 là một ngoại lệ; nó không có nghĩa là "tài nguyên đã được di chuyển" nhưng "yêu cầu đã được xử lý và đây là kết quả của bạn"; đó là một loại chuyển hướng hoàn toàn khác nhau. Xem greenbytes.de/tech/webdav/ khăn
Julian Reschke

84

Sự khác biệt giữa 303 và 307 là:

303 : Xem khác. Yêu cầu được nhận chính xác, nhưng kết quả sẽ được truy xuất bằng cách sử dụng GET trên url chuyển hướng.

307 : Chuyển hướng tạm thời. Toàn bộ yêu cầu nên được chuyển hướng đến url mới. Bất kỳ dữ liệu bài viết nên được đăng lại.

Lưu ý rằng 302 được dự định có hành vi của 307, nhưng hầu hết các trình duyệt đã triển khai nó như hành vi của 303 (cả hai đều không tồn tại trước đó). Do đó, hai mã mới đã được giới thiệu để thay thế 302.

Sự khác biệt giữa 301 và 303:

301 : Tài liệu được di chuyển. Yêu cầu trong tương lai nên sử dụng url mới. Url này đã lỗi thời

Lưu ý: Hãy cẩn thận với mã này. Các trình duyệt và proxy có xu hướng áp dụng bộ nhớ đệm thực sự gây khó chịu cho nó, vì vậy nếu bạn trả lời bằng 301, có thể sẽ mất nhiều thời gian để ai đó truy cập lại url đó.

303 : Yêu cầu được nhận chính xác. Bất kỳ yêu cầu PUT đều được xử lý. Các tài liệu kết quả có thể được lấy từ url chuyển hướng. Yêu cầu trong tương lai vẫn nên đi đến url gốc.


một bài đăng blog hay đi sâu vào chi tiết của 3xx (và tất cả các vấn đề với nó) là tại: insanecoding.blogspot.no/2014/02/ Kẻ
arcuri82

@ skeller88 Bạn thay đổi khiến câu trả lời của tôi không chính xác nên tôi đã hoàn nguyên nó (boo cho những người chấp nhận thay đổi)! Bạn đã giới thiệu sai lầm giống như câu trả lời được chấp nhận. 303 là một loại chuyển hướng khác nhau và các quy tắc khác nhau được áp dụng, như được xác nhận bởi các bình luận của Julian Reschke về câu trả lời được chấp nhận và blog được liên kết bởi arcuri82
GolezTrol
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.