Perbedaan antara kode pengalihan HTTP

151

Perbedaan antara berbagai kode pengalihan HTTP 3XX tidak jelas bagi saya. Ya, saya sudah membaca speknya, tetapi tampaknya ada beberapa perbedaan antara praktik standar dan aktual di sini.

The 301kode redirect tampaknya cukup jelas: Ini berarti sumber daya secara permanen dipindahkan ke URI lain, dan permintaan masa depan harus menggunakan URI.

Dan 307kode redirect juga tampak jelas: itu berarti redirect bersifat sementara, dan permintaan di masa depan masih harus menggunakan URI asli.

Tapi saya tidak tahu apa perbedaan antara 302dan 303, atau mengapa keduanya benar-benar berbeda 301. Tampaknya 302awalnya dimaksudkan sebagai pengalihan sementara , (seperti 307), tetapi dalam praktiknya, sebagian besar peramban memperlakukannya seperti a 303. Tapi apa perbedaan antara a 303dan a 301? Apakah 301seharusnya redirect lebih permanen?

Channel72
sumber

Jawaban:

139
  • 301 : Pengalihan permanen. Klien yang mengajukan permintaan berikutnya untuk sumber daya ini harus menggunakan URI baru. Klien tidak boleh mengikuti arahan ulang secara otomatis untuk permintaan POST / PUT / DELETE.
  • 302 : Redirect untuk alasan yang tidak ditentukan. Klien yang mengajukan permintaan berikutnya untuk sumber daya ini tidak boleh menggunakan URI baru. Klien tidak boleh mengikuti arahan ulang secara otomatis untuk permintaan POST / PUT / DELETE.
  • 303 : Redirect untuk alasan yang tidak ditentukan. Biasanya, 'Operasi telah selesai, lanjutkan di tempat lain.' Klien yang mengajukan permintaan berikutnya untuk sumber daya ini tidak boleh menggunakan URI baru. Klien harus mengikuti arahan ulang untuk permintaan POST / PUT / DELETE, tetapi gunakan GET untuk permintaan tindak lanjut .
  • 307 : Pengalihan sementara. Sumber daya dapat kembali ke lokasi ini di lain waktu. Klien yang mengajukan permintaan berikutnya untuk sumber ini harus menggunakan URI yang lama. Klien tidak boleh mengikuti arahan ulang secara otomatis untuk permintaan POST / PUT / DELETE.

Saya pribadi merekomendasikan menghindari 302 jika Anda punya pilihan. Banyak klien tidak mengikuti spesifikasi ketika mereka menemukan 302. Untuk pengalihan sementara, Anda harus menggunakan 303 atau 307, tergantung pada jenis perilaku apa yang Anda inginkan pada permintaan non-GET. Pilih 307 hingga 303 kecuali Anda membutuhkan perilaku alternatif pada POST / PUT / DELETE.

Bob Aman
sumber
26
Nggak. Mengikuti 303 membutuhkan penulisan ulang metode untuk DAPATKAN. Mengikuti yang lain membutuhkan menjaga metode, tetapi untuk mengkonfirmasi dengan UA jika metode ini tidak aman (jadi metode selain PILIHAN, KEPALA, DAPATKAN, PROPFIND ...)
Julian Reschke
1
@JulianReschke Bisakah Anda menunjukkan tempat dalam spesifikasi yang mendukung pernyataan Anda?
Piotr Dobrogost
7
@ BobAman Dalam deskripsi Anda, Anda melakukan kesalahan yang sama yang dibuat dalam spec HTTP asli ( RFC 1945 ). Misalnya mengatakan bahwa Klien harus mengikuti arahan ulang untuk permintaan POST / PUT / DELETE. setelah 303 redirect tanpa menentukan bahwa kata kerja http untuk digunakan dalam permintaan berikut harus GET menyesatkan ...
Piotr Dobrogost
2
Memperbaiki diri saya sendiri: "Mengikuti 303 membutuhkan penulisan ulang metode untuk DAPATKAN kecuali metode awal adalah KEPALA".
Julian Reschke
2
Piotr: defaultnya adalah tidak memodifikasi metode; sumber daya dipindahkan, itu tidak mempengaruhi cara memanipulasi itu. 303 adalah pengecualian; itu tidak berarti "sumber daya telah pindah" tetapi "permintaan telah diproses, dan inilah hasilnya"; ini merupakan jenis pengalihan yang sama sekali berbeda. Lihat greenbytes.de/tech/webdav/…
Julian Reschke
84

Perbedaan antara 303 dan 307 adalah ini:

303 : Lihat lainnya. Permintaan diterima dengan benar, tetapi hasilnya harus diambil menggunakan GET pada url redirect.

307 : Pengalihan sementara. Seluruh permintaan harus diarahkan ke url baru. Setiap data posting harus diposting kembali.

Perhatikan bahwa 302 dimaksudkan untuk memiliki perilaku 307, tetapi sebagian besar browser menerapkannya sebagai perilaku 303 (keduanya tidak ada saat itu). Oleh karena itu, kedua kode baru diperkenalkan untuk menggantikan 302.

Perbedaan antara 301 dan 303:

301 : Dokumen dipindahkan. Permintaan di masa mendatang harus menggunakan url baru. Url ini sudah usang.

Catatan: Hati-hati dengan kode ini. Peramban dan proksi cenderung menerapkan caching yang sangat agresif, jadi jika Anda membalas dengan 301, mungkin perlu waktu lama bagi seseorang untuk mengunjungi kembali url itu.

303 : Permintaan diterima dengan benar. Setiap permintaan PUT diproses. The dokumen yang dihasilkan dapat diambil dari url redirect. Permintaan di masa mendatang harus tetap ke url asli.

GolezTrol
sumber
posting blog yang bagus yang masuk ke rincian 3xx (dan semua masalah dengan itu) adalah di: insanecoding.blogspot.no/2014/02/…
arcuri82
@ skeller88 Anda mengubah membuat jawaban saya salah, jadi saya mengembalikannya (boo ke orang-orang yang menerima perubahan)! Anda memperkenalkan kesalahan yang sama dengan jawaban yang diterima. 303 adalah jenis pengalihan dan aturan yang berbeda berlaku, sebagaimana dikonfirmasi oleh komentar oleh Julian Reschke pada jawaban yang diterima dan blog yang ditautkan oleh arcuri82
GolezTrol