Contoh 302 vs 303

22

Apa perbedaan antara a 302dan 303respons?

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

  • 10.3.3 302 Ditemukan
  • 10.3.4 303 Lihat Lainnya

Apakah ini bisa dipertukarkan atau mengapa yang satu lebih digunakan? Bisakah Anda memberikan use case kapan satu akan digunakan (dan yang lainnya tidak)?

David542
sumber

Jawaban:

35

Deskripsi pada halaman yang Anda tautkan tampaknya cukup deskriptif tentang tujuan yang dimaksudkan:

302 redirect menunjukkan bahwa redirect bersifat sementara - klien harus memeriksa kembali URL asli dalam permintaan di masa mendatang.

Pengalihan 303 dimaksudkan untuk mengalihkan POSTpermintaan ke GETsumber daya (jika tidak, klien mengasumsikan bahwa metode permintaan untuk lokasi baru sama dengan untuk sumber daya asli).

Jika Anda mengarahkan ulang klien sebagai bagian dari aplikasi web Anda tetapi mengharapkan mereka untuk selalu memulai pada aplikasi web (misalnya, penyingkat URL), 302 redirect tampaknya masuk akal. Pengalihan 303 adalah untuk digunakan ketika Anda menerima POSTdata dari klien (misalnya, pengiriman formulir) dan Anda ingin mengarahkan mereka ke halaman web baru untuk diambil menggunakan GETbukan POST(misalnya, permintaan halaman standar).

Tetapi lihat catatan ini dari definisi kode status - sebagian besar klien akan melakukan hal yang sama untuk 302 atau 303:

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it were a 303
  response, performing a GET on the Location field-value regardless
  of the original request method. The status codes 303 and 307 have
  been added for servers that wish to make unambiguously clear which
  kind of reaction is expected of the client.
larsks
sumber
4
Jelas tapi salah. Pengalihan 303 tidak permanen. RFC menyatakan "Respons 303 TIDAK HARUS di-cache" . Deskripsi yang Anda berikan di sini cocok dengan pengalihan 301.
Ladadadada
2
MEA Culpa. Saya memiliki 301 dan 303 mundur. Saya sudah memperbarui jawabannya.
larsks
sekarang ada 308
Miranda
Saya pikir itu agak menyesatkan untuk menyarankan bahwa 303 "dimaksudkan" untuk mengarahkan POST ke GET - berhenti penuh. Spesifikasi menunjukkan bahwa 303 lebih banyak tentang ketersediaan representasi sumber daya melalui metode yang diminta semula. Jika, misalnya, saya memiliki gambar besar yang dilindungi hak yang hanya tersedia untuk pengguna yang diautentikasi, saya mungkin menggunakan 303 untuk mengarahkan pengguna yang tidak diauthentikasi ke gambar yang lebih kecil. Metode permintaan yang digunakan dalam kasus seperti itu tidak relevan.
beaudet
RFC mengatakan "Metode ini ada terutama untuk memungkinkan output dari skrip yang diaktifkan POST untuk mengarahkan agen pengguna ke sumber daya yang dipilih." dan "Respons terhadap permintaan dapat ditemukan di bawah URI yang berbeda dan HARUS diambil menggunakan metode GET pada sumber daya itu". Saya pikir itu sangat cocok dengan apa yang saya katakan (bertahun-tahun yang lalu), tapi saya yakin ada ruang untuk interpretasi.
larsks
15

Ada empat jenis arahan ulang (saat ini). Awalnya hanya ada dua tetapi sebagian besar klien mengimplementasikan 302 redirect secara tidak benar sehingga dua lagi ditambahkan untuk mengklarifikasi perbedaan antara dua perilaku yang mungkin berbeda saat menerima 302.

RFC yang Anda tautkan untuk menyatakan ini di bagian 302 pengalihan:

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it were a 303
  response, performing a GET on the Location field-value regardless
  of the original request method. The status codes 303 and 307 have
  been added for servers that wish to make unambiguously clear which
  kind of reaction is expected of the client.
  1. Pengalihan 301 adalah pengalihan permanen. Itu dapat di-cache dan bookmark apa pun untuk URL ini harus diperbarui untuk mengarah ke URL baru.
  2. Pengalihan 302 adalah pengalihan sementara. Ini tidak dapat di-cache secara default dan harus diminta kembali setiap kali (tetapi Anda bisa menimpanya dengan header caching). Permintaan tindak lanjut harus menggunakan metode yang sama (POST, GET, CONNECT, PUT, DELETE, dll.) Seperti permintaan asli dan untuk apa pun selain GET dan permintaan HEAD, klien harus meminta pengguna sebelum membuat permintaan. Ini adalah bagian yang salah klien dan sebagian besar dari mereka mengubah metode untuk permintaan tindak lanjut ke GET, terlepas dari metode asli.
  3. Pengalihan 303 sama dengan 302 kecuali bahwa permintaan tindak lanjut sekarang secara eksplisit diubah menjadi permintaan GET dan tidak ada konfirmasi yang diperlukan.
  4. Pengalihan 307 sama dengan 302 kecuali bahwa permintaan tindak lanjut sekarang secara eksplisit sama dengan permintaan asli dan konfirmasi harus diperoleh dari pengguna untuk metode permintaan selain GET dan HEAD.

Klien yang lebih tua mungkin tidak memahami 303 redirect. Apa pun yang membuat permintaan HTTP / 1.1 harus memahami respons 303.

Dimungkinkan untuk mempertimbangkan 300 dan 305 tanggapan sebagai pengalihan, artinya ada enam jenis yang berbeda.

Ladadadada
sumber
0

Jenis pengalihan (301.302.303 ...) yang digunakan memiliki banyak dampak pada bagaimana mesin pencari akan mengindeks dan memberi peringkat konten. Beberapa laba-laba bahkan menolak untuk mengindeks konten yang dialihkan sementara. Detail dapat ditemukan di berbagai literatur SEO ...

pemeras
sumber