Berapa lama browser melakukan cache HTTP 301s?

381

Saya men-debug masalah dengan Pengalihan Permanen HTTP 301. Setelah tes cepat, tampaknya Safari menghapus cache 301-an saat restart, tetapi Firefox tidak.

Kapan IE, Chrome, Firefox dan Safari menghapus cache 301s mereka?

UPDATE: Sebagai contoh, jika saya ingin mengarahkan example1.comke example2.com, tapi saya sengaja set ke redirect ke example3.com, itu adalah masalah. Saya dapat memperbaiki kesalahan, tetapi siapa pun yang telah mengunjungi example1.comsementara itu akan melakukan cache redirect yang salah example3.com, sehingga mereka tidak akan dapat mencapai salah satu example1.comatau example2.comsampai cache mereka dihapus. Setelah diselidiki, saya menemukan bahwa tidak ada Cache-Controldan Expiresheader ditetapkan. Header untuk respons 301 yang salah akan seperti ini:

HTTP/1.1 301 Moved Permanently
Date: Wed, 27 Feb 2013 12:05:53 GMT
Server: Apache/2.2.21 (Unix) DAV/2 PHP/5.3.8
X-Powered-By: PHP/5.3.8
Location: http://example3.com/
Content-Type: text/html

Tes saya sendiri menunjukkan bahwa:

  • IE7, IE8, Android 2.3.4 tidak melakukan cache sama sekali.
  • Firefox 18.0.2, Safari 5.1.7 (pada Windows 7), dan Opera 12.14 semua cache, dan bersihkan cache pada browser restart.
  • IE10 dan Chrome 25 cache, tetapi jangan menghapus browser restart, jadi kapan mereka akan menghapus?
Liam
sumber
7
Tolong beri tahu chrome bahwa kita perlu jalan keluar dari lubang neraka 301 ini: bugs.chromium.org/p/chromium/issues/…
BT
@BT karena masalah mempengaruhi semua browser, benar-benar hanya IETF yang bisa memperbaikinya, mungkin dengan mendefinisikan beberapa batas waktu wajib pada cache 301 yang tidak memiliki TTL, sehingga browser pada akhirnya akan memverifikasi ulang asumsi cache mereka.
McGuireV10
1
Saya memulai diskusi di milis IETF tentang ini, jika ada orang yang masih mengikuti masalah ini merasa seperti menimbang: lists.w3.org/Archives/Public/ietf-http-wg/2017OctDec/0363.html
McGuireV10

Jawaban:

300

Setidaknya dua browser - Chrome dan Firefox - akan men-cache 301 redirect tanpa tanggal kedaluwarsa .

Artinya, itu akan tetap di-cache selama cache browser dapat menampungnya. Itu akan dihapus dari cache jika Anda menghapus cache secara manual, atau jika entri cache dibersihkan untuk memberikan ruang bagi yang baru.

Anda dapat memverifikasi ini setidaknya di Firefox dengan masuk ke about:cachedan menemukannya di bawah cache disk.

Saya tidak tahu tentang perilaku browser lain, seperti IE10 / IE11. Namun, mengingat peramban lain melakukan cache secara tidak terbatas, Anda tetap harus mengakomodasi ini.

Di semua browser, termasuk Chrome / Firefox masih mungkin untuk menimpa perilaku default ini menggunakan header, seperti dijelaskan di bawah ini:

Catatan: jawaban ini ditulis pada tahun 2014 dan perilaku browser dapat berubah seiring waktu.

Jika Anda tidak ingin pengalihan di-cache

Caching tidak terbatas ini hanya caching default oleh browser ini jika tidak ada header Kontrol-Cache. Logikanya adalah bahwa Anda menentukan pengalihan "permanen" dan tidak memberi mereka instruksi caching lainnya, sehingga mereka akan memperlakukannya seolah-olah Anda ingin itu di-cache tanpa batas waktu.

Browser masih menghormati header Kontrol-Cache dan Kedaluwarsa seperti dengan respons lainnya, jika ditentukan.

Anda dapat menambahkan tajuk seperti Cache-Control: max-age=3600atau Expires: Thu, 01 Dec 2014 16:00:00 GMTke pengalihan 301 Anda. Anda bahkan bisa menambahkan Cache-Control: no-cachesehingga tidak akan di-cache secara permanen oleh browser atau Cache-Control: no-storebahkan tidak dapat disimpan dalam penyimpanan sementara oleh browser.

Alternatif yang lebih baik menurut saya adalah menggunakan redirect 302 atau 307. Ini tidak menyiratkan ke browser atau cache bahwa mereka adalah pengalihan "permanen" dan karenanya tidak boleh di-cache dalam absennya header Kontrol-Cache.

Bagi saya, sepertinya mengeluarkan 301 redirect tetapi menandainya sebagai non-cacheable bertentangan dengan semangat untuk apa 301 redirect diperuntukkan, meskipun mungkin secara teknis valid. YMMV, dan Anda mungkin menemukan kasus tepi di mana masuk akal untuk pengalihan "permanen" untuk memiliki batas waktu.

Jika sebelumnya Anda mengeluarkan 301 redirect tetapi ingin membatalkannya

Jika orang masih memiliki cache redirect 301 di browser mereka, mereka akan terus dibawa ke halaman target terlepas dari apakah halaman sumber masih memiliki redirect di tempat. Pilihan Anda untuk memperbaiki ini termasuk:

  • Solusi paling sederhana dan terbaik adalah dengan mengeluarkan 301 redirect kembali.

    Peramban akan menyadari bahwa ia diarahkan kembali ke apa yang sebelumnya dianggap sebagai URL yang dinonaktifkan, dan ini akan menyebabkannya mengambil kembali URL itu lagi untuk mengonfirmasi bahwa pengalihan yang lama belum ada.

    Sunting: beberapa komentar meragukan hal ini, lihat di bawah.

  • Jika Anda tidak memiliki kendali atas situs tempat target pengalihan sebelumnya, maka Anda tidak beruntung. Coba dan minta pemilik situs untuk mengarahkan kembali kepada Anda.

Juga pencegahan lebih baik daripada mengobati - hindari pengalihan 301 jika Anda tidak yakin ingin secara permanen menghapus URL yang lama.

thomasrutter
sumber
18
Juga, apakah Anda memiliki referensi yang menunjukkan bahwa browser menangani pengalihan permanen melingkar dengan mengambil kembali URL asli?
Kevin Christopher Henry
7
301 redirect back jangan bekerja, browser masih cache 301 redirect lama dan saya melihat loop tak terbatas
Yuriy Kolodovskyy
5
bagaimana saya melakukan tes: beberapa waktu lalu saya melakukan 301 redirect untuk http://www.SOMEHOST.comke https://www.SOMEHOST.com. Tetapi sekarang http://www.SOMEHOST.comharus menjadi host utama untuk situs. Jadi, redirect dari https ke http dihapus. Seperti yang Anda tunjukkan, saya melakukan pengalihan 301 dari https://www.SOMEHOST.comke http://www.SOMEHOST.com, tetapi lihat loop. Browser tidak mengambil ulang ...
Yuriy Kolodovskyy
8
Saya mengonfirmasi bahwa pengalihan kembali (dengan pengalihan PHP dalam kasus saya) berfungsi dengan baik di Google Chrome selama (jelas) Anda menghapus pengalihan 301 awal.
Vincent Poirier
15
Saya dapat mengkonfirmasi bahwa redirect back berfungsi dengan baik. Browser yang melihat redirect loop membatalkan entri cache. Diuji pada IE11, Firefox 52, Safari 10, Chrome 57.
Munhitsu
258

Dari Chrome 71

Untuk menghapus redirect permanen, buka chrome: // settings / clearBrowserData dan dari sana hanya membersihkan "gambar dan file yang di-cache" menghapus redirect.

Chrome 48-70

Buka chrome: // net-internal. Di sebelah kanan bilah status merah atas, klik panah bawah ▼ untuk membuka menu tarik-turun, dan di bawah grup "Alat", pilih "Kosongkan cache".

Pada versi 48, ini adalah satu-satunya hal yang berhasil bagi saya untuk menghapus 301 yang di-cache.

McGuireV10
sumber
14
Pada Chrome versi 54, sayangnya ini tidak berfungsi untuk saya.
pwagner
4
Setelah dipikir-pikir, saya tidak benar-benar menjawab pertanyaan sebenarnya , "Berapa lama browser melakukan cache 301," dan jawaban saya tidak akan membantu siapa pun yang mengarahkan ulang situs yang menghadap publik di mana Anda mungkin perlu cara untuk membatalkan secara permanen 301 tanpa mengetahui berapa banyak peramban di alam yang menyimpan cache redirect - jawaban lain mengatasi sebagian skenario itu. Jawaban saya benar-benar hanya berguna untuk pengembang atau skenario intranet tempat Anda dapat berkomunikasi dengan semua pengguna yang terpengaruh.
McGuireV10
1
Bekerja di Chrome versi 68.0.3440.106 (Bangun Resmi)
Thum Choon Tat
12
chrome: // net-internal telah dimusnahkan di Chrome 71. Bagian drop-down / Tools hilang. Ada DNS> Host resolver cache> Bersihkan tombol cache host, tetapi ini tidak berhasil menghapus 301s yang di-cache.
t-jam
52
Di Chrome 71, chrome: // settings / clearBrowserData dan dari sana hanya membersihkan "gambar dan file yang di-cache" menghapus arahan ulang.
Bemmu
179

Sebuah jawaban yang membantu mereka yang sangat ingin menyingkirkan cache redirect:

Chrome cache 301 redirect tanpa batas (dalam cache disk lokal). Untuk menghapus cache ini:

  • buka DevTools Anda (tekan F12)
  • pada tab Jaringan centang kotak centang "Nonaktifkan cache"
  • biarkan DevTools tetap terbuka dan muat ulang halaman (tekan F5)

Ketika semuanya baik-baik saja, Anda dapat menghapus centang "Nonaktifkan cache" dan semuanya akan terus berfungsi seperti yang diharapkan.

Olaf
sumber
14
Ini berfungsi dan bahkan setelah mengaktifkan kembali caching, pengalihan tidak ada lagi. TERIMA KASIH!
migg
2
Sepertinya ini tidak berfungsi untuk domain yang menunjuk ke 127.0.0.1 melalui file host lokal. Apakah ada opsi lain untuk kasus ini?
pwagner
Tidak berfungsi jika pengalihan, tidak disengaja, menunjuk ke port lain, seperti dari localhost:8000ke localhost(port 80). Saya juga membersihkan seluruh data situs / aplikasi dari localhost dan localhost: 8000, tetapi tidak ada yang membantu.
Dennis98
3
Solusi ini bekerja di Chrome pada 16 Nov 2019 versi 78.0.3904.97. Solusi lain tidak lagi tersedia. Setelah berfungsi, Anda dapat menutup alat pengembang dan itu akan terus berfungsi dengan baik.
Peter Wooster
Jawaban yang diterima.
Aysennoussi
43

Buat pengguna mengirimkan formulir posting pada url itu dan pengalihan cache telah hilang :)

<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
    <input type="submit" value="fix" />
</form>
</body>
Krtek Net
sumber
2
Saya setuju ini adalah metode terbaik yang saya temukan untuk melepaskannya.
esjay
tidak seperti jawaban lain, metode ini cocok untuk menyelesaikan masalah orang lain tanpa membuka konsol pengembang! terima kasih
Alexey Rytikov
4
fetch ('URL', {metode: 'POST'}) harus dilakukan dengan cara yang sama. Terima kasih! Ini menyelamatkan saya dari sakit kepala!
calvin
Saya tidak percaya bahwa ini adalah satu-satunya cara yang bekerja untuk saya (saya mencoba semua metode lain terlebih dahulu - bahkan konsol fetch () gagal karena kebijakan keamanan lintas situs).
user36388
24

301adalah respons yang dapat di-cache per HTTP RFC dan browser akan menyimpannya tergantung pada header cache HTTP yang Anda miliki pada respons. Gunakan FireBug atau Charles untuk memeriksa header respons untuk mengetahui durasi pasti respons yang akan di-cache.

Jika Anda ingin mengontrol durasi caching, Anda dapat menggunakan header respons HTTP Cache-Controldan Expiresmelakukan hal yang sama. Atau, jika Anda tidak ingin menembaki 301respons sama sekali, gunakan tajuk berikut.

Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Alex J
sumber
12
Meskipun secara teknis benar, jawaban Anda tidak menjawab pertanyaan pengguna dan karenanya tidak menjawab pertanyaan saya datang ke sini. Kapan ada, s-cache 301-s header yang sudah ada di browser kedaluwarsa untuk browser utama?
merampok
Jika ada yang masih tertarik, instruksi tautan ini dapat mengaktifkan cache untuk 301.
Francisco Presencia
Tautan ini untuk FF dan tidak berfungsi untuk saya. Ekstensi pengembang web terinstal 1.2.5 dan menggunakan FF 23.0.1
an phu
pertanyaan itu tidak dijawab. Pertanyaannya adalah, berapa lama redirection akan di-cache jika tidak ada tanggal kedaluwarsa yang ditentukan
Dennis Flagg
21

Ada cara yang sangat sederhana untuk menghapus cache browser untuk pengalihan http misalnya 301, 307 dll.

Anda dapat membuka panel jaringan di konsol pengembang di chrome. Pilih panggilan jaringan. Klik kanan padanya dan kemudian klik Hapus Browser Cache untuk menghapus pengalihan cache.

menu konteks panggilan jaringan

Rajesh Paul
sumber
1
Terima kasih banyak! Solusi sederhana dan Berfungsi! Cara ini juga akan berhasil di masa depan.
sgon00
16

Dikonfirmasi !! membuat pengguna mengirimkan permintaan posting ke url yang terpengaruh dan pengalihan cache dilupakan.

Kemenangan cepat adalah memasukkan ini di konsol browser jika Anda dapat:

fetch('example.com/affected/link', {method: 'post'}).then(() => {})

Berguna jika Anda mengetahui browser yang terpengaruh (terutama selama pengembangan).

Atau , jika Anda memiliki akses ke halaman redirect 301 sebelumnya, maka Anda dapat menambahkan skrip ini ke halaman dan kapan pun dikunjungi, 301 yang di-cache akan dilupakan.

Emeke Ajeh
sumber
Ini mirip dengan formulir posting di atas, hanya saja kurang usaha.
jpswade
Benar @jpswade
Emeke Ajeh
12

Saya akan memposting jawaban yang membantu saya:

buka url:

chrome://settings/clearBrowserData

seharusnya memunculkan popup dan kemudian ..

  • pilih saja: cached images and files .
  • pilih kotak waktu: from beginning
John Tribe
sumber
Bekerja di Chrome 79!
webaholik
Bekerja di Chrome 80, terima kasih!
Joseph
6

sebagai jawaban dari @thomasrutter

Jika sebelumnya Anda mengeluarkan 301 redirect tetapi ingin membatalkannya

Jika orang masih memiliki cache redirect 301 di browser mereka, mereka akan terus dibawa ke halaman target terlepas dari apakah halaman sumber masih memiliki redirect di tempat. Pilihan Anda untuk memperbaiki ini termasuk:

Solusi paling sederhana dan terbaik adalah dengan mengeluarkan 301 redirect kembali.

Peramban akan menyadari bahwa ia diarahkan kembali ke apa yang sebelumnya dianggap sebagai URL yang dinonaktifkan, dan ini akan membuatnya mengambil kembali URL itu untuk mengonfirmasi bahwa pengalihan lama tidak ada di sana.

Jika Anda tidak memiliki kendali atas situs tempat target pengalihan sebelumnya, maka Anda tidak beruntung. Coba dan minta pemilik situs untuk mengarahkan kembali kepada Anda.

Sebenarnya, ini berarti:

  1. a.com 301 hingga b.com

  2. hapus a.com's 301

  3. tambahkan b.com 301 ke a.com

Lalu berhasil.

phil han
sumber
2
Tapi kemudian Anda masih memiliki 301 b.com yang tergeletak di sekitar: (- perbaikan kotor
BT
1
Bisakah Anda menghapus pengalihan dengan mengeluarkan 301 lain dari halaman yang berbeda ? mis. ( a.com301 -> b.com) (hapus a.com301) (tambahkan a.com/abcdefg301 -> a.com) dan paksakan klien untuk melihatnya a.com/abcdefg?
nemec
Terima kasih itu berhasil! Diuji pada IE11, Firefox 52, Safari 10, Chrome 57
Munhitsu
Saya memiliki situasi di mana saya ingin menggunakan a.com dan b.com. Jadi b.com 301 a.com bukan pilihan. Solusi kami adalah pindah ke HTTPS - kami tidak memiliki
arahan
6

Saya punya solusi sederhana yang berfungsi pada semua browser utama (versi terbaru), termasuk IE, Chrome dan FF

  1. Ctrl + Shift + Del
  2. -
    1. Chrome: Pilih "History Browsing" dan "Cache ..."
    2. IE: Saya meninggalkan opsi default "File Internet sementara dan file situs web", "Cookie dan data situs web", "Riwayat"
    3. FF: "Menjelajahi dan Mengunduh riwayat", "Cache"
  3. Klik "Hapus"
  4. Tutup dan buka kembali browser Anda. Itu harus bekerja
Dung Le
sumber
Anda juga harus memastikan bahwa Anda tidak berada di halaman yang dimaksud, karena beberapa browser tidak menghapus item yang di-cache dari halaman terbuka.
Oliver Schimmer
6

Untuk tujuan pengujian (untuk menghindari pengalihan cache), orang dapat membuka WINDOW PRIVATE BARU : klik CTRL+SHIFT+N[jika Anda menggunakan Mozilla, gunakan P]

T.Todua
sumber
Ini telah diturunkan peringkatnya, mungkin karena janji utama dari "jendela pribadi" bukanlah untuk MENULIS ke cache, tetapi masih dapat MEMBACA / MENGGUNAKAN mereka. TAPI bagi saya di Firefox 37.0.1 (Linux) ini berfungsi dan sangat cepat dan bermanfaat. Jendela pribadi mencerminkan pengaturan saat ini / tidak di-cache dari server-web, sedangkan tab browser yang normal menggunakan pengalihan cache dalam cache.
alfonx
alfonx: Jendela pribadi mungkin tidak menggunakan kembali cache hanya karena pemilik server dapat menggunakan elemen dengan cara cookie yang mengungkapkan identitas pengguna sebelumnya. Meskipun saya harus mengakui bahwa penggunaan kembali cache mungkin aman terhadap istri yang membenci porno.
Zdenek
6
Ini tidak berfungsi jika Anda sudah memiliki cache 301. Pribadi memang akan menggunakan pengalihan yang di-cache.
jeffmcneill
1

Uji pengalihan Anda menggunakan mode penyamaran / InPrivate sehingga ketika Anda menutup peramban itu akan membersihkan cache itu dan membuka kembali jendela tidak akan mengandung cache.

Yougotiger
sumber
1

Seperti yang ditunjukkan oleh jawaban lainnya. Caching mungkin tidak terbatas di browser. Ini sangat berbahaya. Jadi jangan lakukan itu. Setidaknya tambahkan header cache. Dalam htaccess saya selalu melakukannya dengan cara ini sekarang caching sama sekali:

<IfModule mod_rewrite.c>
  RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
  # The E=nocache:1 sets the environment variable nocache to the value of one
  RewriteRule ^/?(.*) https://www.example.org/$1 [L,R=301,E=nocache:1]
</IfModule>


<IfModule mod_headers.c>
  ## Set the response header if the "nocache" environment variable is set
  ## in the RewriteRule above.
  Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache

  ## Set Expires too ...
  Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</IfModule>
Yunzen
sumber
1

Untuk mengatasi masalah alamat localhost, saya mengubah nomor port situs yang digunakan. Ini bekerja pada Chrome versi 73.0.3683.86.

combatc2
sumber
-1

Pada Google Chrome Versi 79 terbaru, Anda dapat menggunakan chrome: // net-internal dan pilih pada DNS dari panel kiri, lalu ketuk tombol Bersihkan cache host

Cuplikan layar chrome membuka halaman internal internet

Mohammad Ersan
sumber
Tidak yakin mengapa ini diturunkan, Http 301 adalah masalah terkait cache host DNS
Mohammad Ersan