Pengalihan HTTP: 301 (permanen) vs. 302 (sementara)

381

Apakah klien seharusnya berperilaku berbeda? Bagaimana?

flybywire
sumber
RFC 2616 - Kode Status HTTP aku bisa mengulang segala sesuatu di sana, tapi itu menyatakan cukup jelas;)
Tiemen
2
Perlu dicatat bahwa spesifikasi ini juga menyediakan 303 dan 307 kode status untuk pengalihan sementara yang lebih bernuansa.
Patrick McElhaney
303 dan 307 tidak lagi dibutuhkan. 303 seharusnya menentukan bahwa URL baru terkait tetapi tidak setara, dan harus dimuat dengan GET bahkan jika permintaan saat ini POST, tetapi browser juga tetap melakukan ini dengan 302. 307 seharusnya secara eksplisit menentukan bahwa redirect bersifat sementara dan bukan 302 yang tidak menentukan apakah itu sementara, tetapi browser dan crawler memperlakukan 302 sebagai sementara.
thomasrutter

Jawaban:

569

Status 301 berarti sumber daya (halaman) dipindahkan secara permanen ke lokasi baru. Klien / browser tidak boleh mencoba untuk meminta lokasi asli tetapi menggunakan lokasi baru mulai sekarang.

Status 302 berarti sumber daya untuk sementara berada di tempat lain, dan klien / browser harus terus meminta url asli.

Philippe Leybaert
sumber
12
Terima kasih. Apakah ini berarti bahwa jika saya menggunakan pengalihan 301 (permanen), klien dapat memutuskan untuk tidak pernah lagi mengambil lokasi lama dan alih-alih selalu menggunakan langsung URL baru?
flybywire
18
Persis! Bahkan, menurut spesifikasi, klien HARUS selalu pergi ke lokasi baru.
Philippe Leybaert
7
Namun di browser, bagaimana pengaruhnya? Menulis ulang sejarah di tombol kembali misalnya, untuk menghindari kembali ke yang salah di 301? Diam-diam mengubah bookmark ke 301 jika Anda mengklik yang lama?
Xavi Montero
9
@XaviMontero Sebagian besar browser modern cache 301s dan tidak akan repot meminta sumber asli sama sekali hingga 6 bulan
Jon
34
Trik untuk Mengingat Kode status HTTP 301-> Perm dan 302-> Temp Redirect Two dimulai dengan T, sama dengan Temporary dimulai dengan T.
ScottCate
108

Ketika spider mesin pencari menemukan 301 kode status di header respons halaman web, ia memahami bahwa halaman web ini tidak ada lagi, ia mencari header lokasi sebagai respons memilih URL baru dan mengganti URL yang diindeks dengan URL baru dan juga mentransfer pagerank .

Jadi mesin pencari me-refresh semua URL yang diindeks yang tidak lagi ada (301 ditemukan) dengan URL baru, ini akan mempertahankan lalu lintas halaman web lama Anda, pagerank dan mengalihkannya ke yang baru (Anda tidak akan kehilangan lalu lintas halaman web lama Anda).

Browser: jika browser menemukan 301 kode status maka cache cache pemetaan lama dengan URL baru, klien / browser tidak akan mencoba untuk meminta lokasi asli tetapi menggunakan lokasi baru mulai sekarang kecuali cache dihapus.

masukkan deskripsi gambar di sini

Ketika spider mesin pencari menemukan 302 status untuk halaman web, itu hanya akan mengarahkan sementara ke lokasi baru dan merayapi kedua halaman. URL halaman web yang lama masih ada di database mesin pencari dan selalu berusaha untuk meminta lokasi lama dan merayapnya. Klien / browser masih akan mencoba untuk meminta lokasi asli.

masukkan deskripsi gambar di sini

Baca lebih lanjut tentang cara menerapkannya di asp.net c # dan apa dampaknya pada mesin pencari - http://www.dotnetbull.com/2013/08/301-permanent-vs-302-tentara-stentar-status-code-aspnet -csharp-Implementation.html

Rohit
sumber
35

Sebagian besar 301 vs 302 penting untuk pengindeksan di mesin pencari, karena crawler mereka memperhitungkan ini dan mentransfer PageRank saat menggunakan 301.

Lihat jawaban Peter Lee untuk lebih jelasnya.

Residuum
sumber
20

301 adalah sumber daya yang diminta telah diberi URI permanen baru dan setiap referensi di masa mendatang untuk sumber daya ini harus dilakukan dengan menggunakan salah satu URI yang dikembalikan.

302 adalah bahwa sumber daya yang diminta tinggal sementara di bawah URI yang berbeda.

Karena pengalihan dapat diubah pada kesempatan, klien harus terus menggunakan Request-URI untuk permintaan di masa mendatang.

Respons ini hanya dapat ditutup jika ditunjukkan oleh bidang header Kontrol-Cache atau Kedaluwarsa.

Peter Lee
sumber
1
Jadi, 301 masuk akal, tapi saya kesulitan menemukan contoh penggunaan yang bagus untuk 302 .
Bob Stein
4
@ BobStein-VisiBone misalnya 302 redirect: buat file old.php dengan kode <?php header("location: http://example.com/new.php"); ?>dan file new.php - <?php echo 'I am new'; ?>dan buka tautan . Akan ada arahan ulang dan menampilkan teks "Saya baru". Kemudian ganti kode di old.php ke <?php echo 'I am old'; ?>dan juga pergi ke tautan . Anda akan melihat teks "Saya sudah tua". Jika Anda telah melakukan redirect 301 di old.php, Anda akan melihat teks "Saya baru" bahkan setelah perubahan dalam kode old.php.
Rasul
2
@ BobStein-VisiBone Saya memiliki halaman yang sudah usang dan tidak dapat ditampilkan. Kita perlu membuat halaman baru tetapi tidak akan siap untuk sementara waktu. Kami menggunakan arahan sementara untuk halaman yang ada yang bermanfaat bagi pengunjung. Setelah halaman baru dibuat, kami kemudian akan menggunakan redirect permanen untuk itu.
EddieC
4
302 berguna jika URL tujuan Anda bergantung pada negara.
Brian
7
Saya sekarang sudah lama tetapi di sini adalah contoh yang baik. Webcomics biasanya memiliki url yang mengarah ke komik terbaru. Jika itu webcomic.com/latestdan pengalihan ke webcomic.com/some-comic-titledengan 301 browser akan selalu mengarahkan ke "some-comic-title". Bahkan ketika komik berikutnya telah diterbitkan dan "terbaru" sekarang dialihkan ke "komik-judul lain" ... Di sinilah 302 akan lebih baik.
hsan
17

301 redirect di-cache tanpa batas (setidaknya oleh beberapa browser).

Ini berarti, jika Anda menyiapkan 301, kunjungi halaman itu, Anda tidak hanya diarahkan, tetapi pengalihan juga di-cache.

Ketika Anda mengunjungi halaman itu lagi, Browser Anda * bahkan tidak perlu meminta URL itu, itu hanya pergi ke target pengalihan cache.

Satu-satunya cara untuk membatalkan 301 bagi pengunjung dengan pengalihan di Cache, adalah mengarahkan ulang kembali ke URL asli **. Dalam hal ini, Browser akan melihat loop, dan akhirnya benar-benar meminta URL yang dimasukkan.

Jelas, itu bukan pilihan jika Anda memutuskan untuk mengakses Facebook atau sumber daya lain yang tidak sepenuhnya Anda kendalikan.

Sayangnya, banyak Penyedia Hosting menawarkan fitur di Antarmuka Admin mereka hanya disebut "Redirection", yang melakukan pengalihan 301. Jika Anda menggunakan ini untuk mengarahkan sementara domain Anda ke Facebook sebagai halaman yang akan datang, Anda pada dasarnya kacau.

* setidaknya Chrome dan Firefox, menurut Berapa lama browser melakukan cache HTTP 301s?. Baru saja mencobanya dengan Chrome 45. Edit: Safari 7.0.6 di Mac juga cache, restart browser tidak membantu (Link mengatakan bahwa pada Safari 5 pada Windows itu membantu.)

** Saya mencoba javascript window.location = '', karena itu akan menjadi solusi yang dapat diterapkan dalam banyak kasus - tidak berfungsi. Ini menghasilkan Loop tak terbatas yang tidak terdeteksi. Namun, php header('Location: new.url')tidak memutus perulangan

Intinya: hanya gunakan 301s jika Anda benar-benar yakin Anda tidak akan pernah menggunakan URL itu lagi. Biasanya tidak pernah di direktori root (example.com/)

Sebastian Schmid
sumber
7

Masalah utama dengan 301 adalah browser akan melakukan cache pengalihan bahkan jika Anda menonaktifkan pengalihan dari tingkat server.

Itu selalu lebih baik untuk menggunakan 302 jika Anda mengaktifkan pengalihan untuk jendela pemeliharaan pendek.

Jobin Joseph
sumber
Ini jelas bukan "masalah"; hanya bagaimana ini dimaksudkan untuk bekerja. Mengarahkan HTTP ke HTTPS, Mengarahkan situs web yang ditinggalkan ke situs web baru, dll., Adalah beberapa penggunaan yang biasa dilakukan pada 301.
HosseyNJF