Saya harus kehilangan beberapa hal mendasar tentang cookie. Di localhost, ketika saya menetapkan cookie di sisi server dan menentukan domain secara eksplisit sebagai localhost (atau .localhost). cookie sepertinya tidak diterima oleh beberapa browser.
Firefox 3.5: Saya memeriksa permintaan HTTP di Firebug. Apa yang saya lihat adalah:
Set-Cookie:
name=value;
domain=localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
atau (ketika saya mengatur domain ke .localhost):
Set-Cookie:
name=value;
domain=.localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
Dalam kedua kasus, cookie tidak disimpan.
IE8: Saya tidak menggunakan alat tambahan, tetapi cookie sepertinya tidak disimpan juga, karena tidak dikirim kembali dalam permintaan berikutnya.
Opera 9.64: Baik localhost dan .localhost berfungsi , tetapi ketika saya memeriksa daftar cookie di Preferensi, domain diatur ke localhost.local meskipun terdaftar di bawah localhost (dalam pengelompokan daftar).
Safari 4: Baik localhost dan .localhost berfungsi , tetapi mereka selalu terdaftar sebagai .localhost di Preferensi. Di sisi lain, cookie tanpa domain eksplisit, itu ditampilkan sebagai hanya localhost (tanpa titik).
Apa masalah dengan localhost? Karena sejumlah inkonsistensi, harus ada beberapa aturan khusus yang melibatkan localhost. Juga, tidak sepenuhnya jelas bagi saya mengapa domain harus diawali dengan titik? RFC 2109 secara eksplisit menyatakan bahwa:
Nilai untuk atribut Domain tidak mengandung titik yang disematkan atau tidak dimulai dengan titik.
Mengapa? Dokumen tersebut menunjukkan bahwa ia harus melakukan sesuatu dengan keamanan. Saya harus mengakui bahwa saya belum membaca keseluruhan spesifikasi (mungkin melakukannya nanti), tetapi kedengarannya agak aneh. Berdasarkan ini, pengaturan cookie di localhost tidak mungkin.
Jawaban:
Secara desain, nama domain harus memiliki setidaknya dua titik; jika tidak, browser akan menganggapnya tidak valid. (Lihat referensi di http://curl.haxx.se/rfc/cookie_spec.html )
Saat bekerja
localhost
, domain cookie harus dihilangkan seluruhnya. Mengaturnya ke""
atauNULL
atauFALSE
bukannya"localhost"
tidak cukup.Untuk PHP, lihat komentar di http://php.net/manual/en/function.setcookie.php#73107 .
Jika bekerja dengan Java Servlet API, jangan panggil
cookie.setDomain("...")
metode ini sama sekali.sumber
Domain=
parameter saat mengatur cookie. Jika Anda hanya mengatur domain ke nol atau kosong, mungkin kerangka kerja Anda akan mengirimDomain=
parameter dengan nilai itu, alih-alih menghilangkannya? Periksa dengan misalnya Firebug.((domain && domain !== "localhost") ? ";domain="+domain : "")
Saya secara luas setuju dengan @Ralph Buchfelder, tetapi inilah beberapa amplifikasi dari ini, dengan bereksperimen ketika mencoba mereplikasi sistem dengan beberapa subdomain (seperti example.com, fr.example.com, de.example.com) pada mesin lokal saya ( OS X / Apache / Chrome | Firefox).
Saya telah mengedit / etc / hosts untuk menunjukkan beberapa subdomain imajiner di 127.0.0.1:
Jika saya bekerja di fr.localexample.com dan saya mengabaikan parameter domain, cookie disimpan dengan benar untuk fr.localexample.com, tetapi tidak terlihat di subdomain lainnya.
Jika saya menggunakan domain dari ".localexample.com", cookie disimpan dengan benar untuk fr.localexample.com, dan adalah terlihat di subdomain lainnya.
Jika saya menggunakan domain "localexample.com", atau ketika saya mencoba domain hanya "localexample" atau "localhost", cookie itu tidak disimpan.
Jika saya menggunakan domain "fr.localexample.com" atau ".fr.localexample.com", cookie disimpan dengan benar untuk fr.localexample.com dan (benar) tidak terlihat di subdomain lain.
Jadi persyaratan bahwa Anda memerlukan setidaknya dua titik di domain tampaknya benar, meskipun saya tidak dapat melihat mengapa itu seharusnya.
Jika ada yang ingin mencoba ini, berikut ini beberapa kode yang berguna:
sumber
localhost: Anda dapat menggunakan:
domain: ".app.localhost"
dan itu akan berhasil. The 'domain' parameter kebutuhan 1 atau lebih titik dalam nama domain untuk pengaturan cookies. Maka Anda dapat memiliki sesi bekerja di subdomain localhost seperti:api.app.localhost:3000
.sumber
express.session({cookie: { domain: '.app.localhost', maxAge: 24 * 60 * 60 * 1000 }})
.app.
datangnya pertandaan ini ? Apakah itu bagian dari beberapa SPEC? Dan apakah itu berlaku untuk semua domain yang tidak sesuai (yang tanpa dua titik)? Juga, apakah ini akan berfungsi dengan browser lama? : ^)Ketika cookie diatur dengan domain eksplisit 'localhost' sebagai berikut ...
... maka browser mengabaikannya karena tidak menyertakan setidaknya dua periode dan bukan salah satu dari tujuh domain tingkat atas yang ditangani secara khusus .
Perhatikan bahwa jumlah periode di atas mungkin mengasumsikan bahwa periode terkemuka diperlukan. Namun periode ini diabaikan di peramban modern dan mungkin seharusnya dibaca ...
Perhatikan bahwa nilai default untuk atribut domain adalah nama host dari server yang menghasilkan respons cookie .
Jadi solusi untuk cookie yang tidak disetel untuk localhost adalah tidak menentukan atribut domain dan membiarkan browser menggunakan nilai default - ini tampaknya tidak memiliki kendala yang sama dengan nilai eksplisit dalam atribut domain.
sumber
Hasil yang saya peroleh bervariasi berdasarkan browser.
Chrome- 127.0.0.1 berfungsi tetapi localhost .localhost dan "" tidak. Firefox- .localhost berfungsi tetapi localhost, 127.0.0.1, dan "" tidak.
Belum diuji di Opera, IE, atau Safari
sumber
Domain=
parameter berfungsi.Domain=
juga berfungsi, tetapiDomain=localhost
tidak.Menghabiskan banyak waktu untuk memecahkan masalah ini sendiri.
Menggunakan PHP, dan Tidak ada di halaman ini yang berfungsi untuk saya. Saya akhirnya menyadari dalam kode saya bahwa parameter 'aman' ke PHP session_set_cookie_params () selalu disetel ke TRUE.
Karena saya tidak mengunjungi localhost dengan https browser saya tidak akan pernah menerima cookie. Jadi, saya memodifikasi bagian dari kode saya untuk secara kondisional menetapkan parameter 'aman' berdasarkan $ _SERVER ['HTTP_HOST'] menjadi 'localhost' atau tidak. Bekerja dengan baik sekarang.
Saya harap ini membantu seseorang.
sumber
Jika Anda mengatur cookie dari domain lain (yaitu Anda mengatur cookie dengan membuat permintaan asal silang XHR), maka Anda perlu memastikan bahwa Anda menetapkan
withCredentials
atribut ke true pada XMLHttpRequest yang Anda gunakan untuk mengambil cookie seperti yang dijelaskan di sinisumber
Anda dapat menggunakan
localhost.org
atau lebih tepatnya.localhost.org
itu akan selalu diselesaikan127.0.0.1
sumber
Saya lebih beruntung menguji secara lokal menggunakan 127.0.0.1 sebagai domain. Saya tidak yakin mengapa, tetapi saya memiliki hasil yang beragam dengan localhost dan .localhost, dll.
sumber
Tidak satu pun dari perbaikan yang disarankan bekerja untuk saya - mengaturnya ke nol, salah, menambahkan dua titik, dll - tidak berfungsi.
Pada akhirnya, saya baru saja menghapus domain dari cookie jika itu adalah localhost dan sekarang berfungsi untuk saya di Chrome 38 .
Kode sebelumnya (tidak berfungsi):
Kode baru (sekarang berfungsi):
sumber
Saya memiliki masalah yang sama dan saya memperbaikinya dengan meletakkan 2 titik di nama cookie itu sendiri tanpa menentukan domain apa pun.
sumber
Tampaknya ada masalah saat Anda menggunakan
https://<local-domain>
laluhttp://<local-domain>
. Situshttp://
tidak mengirim cookie dengan permintaan setelahhttps://
situs menetapkannya. Paksa memuat ulang dan menghapus cache tidak membantu. Hanya pembersihan manual cookie yang berfungsi. Juga, jika saya menghapusnya dihttps://
halaman, makahttp://
halaman mulai bekerja lagi.Tampaknya terkait dengan "Cookie aman yang ketat". Penjelasan yang bagus di sini . Itu dirilis di Chrome 58 pada 2017-04-19.
Sepertinya Chrome memang merekam cookie aman dan cookie tidak aman karena akan menampilkan cookie yang benar tergantung pada protokol halaman saat mengklik ikon bilah alamat.
Tetapi
Developer tools > Application > Cookies
tidak akan menampilkan cookie tidak aman ketika ada cookie aman dengan nama yang sama untuk domain yang sama, juga tidak akan mengirim cookie tidak aman dengan permintaan apa pun. Ini sepertinya bug Chrome, atau jika perilaku ini diharapkan, harus ada beberapa cara untuk melihat cookie aman saat dihttp
halaman dan indikasi bahwa tersebut sedang ditimpa.Solusinya adalah dengan menggunakan cookie bernama berbeda tergantung pada apakah cookie tersebut untuk situs http atau situs https, dan untuk menamai mereka khusus untuk aplikasi Anda. Sebuah
__Secure-
awalan menunjukkan bahwa cookie harus benar-benar aman, dan juga merupakan praktik yang baik karena aman dan tidak aman tidak akan bertabrakan. Ada manfaat lainnya untuk awalan juga.Menggunakan
/etc/hosts
domain yang berbeda untuk akses https vs. http akan bekerja juga, tetapi satuhttps://localhost
kunjungan tidak disengaja akan mencegah cookie dengan nama yang sama bekerja dihttp://localhost
situs - jadi ini bukan solusi yang baik.Saya telah mengajukan laporan bug Chrome .
sumber
document.cookie = valuename + "=" + value + ";" + expires + "; domain =; path = /";
ini "domain =; path = /"; akan mengambil domain dinamis karena cookie-nya akan berfungsi di subdomain. jika Anda ingin menguji di localhost itu akan berfungsi
sumber
Tidak ada jawaban di sini yang berfungsi untuk saya. Saya memperbaikinya dengan meletakkan PHP saya sebagai hal pertama di halaman.
Seperti tajuk lainnya, cookie harus dikirim sebelum output apa pun dari skrip Anda (ini adalah batasan protokol). Ini mengharuskan Anda melakukan panggilan ke fungsi ini sebelum output apa pun, termasuk dan tag serta spasi putih apa pun.
Dari http://php.net/manual/en/function.setcookie.php
sumber
Ada masalah pada Chromium terbuka sejak 2011 , bahwa jika Anda secara eksplisit mengatur domain sebagai 'localhost', Anda harus menetapkannya sebagai
false
atauundefined
.sumber
Saya sedang bermain-main sedikit.
berfungsi di Firefox dan Chrome mulai hari ini. Namun, saya tidak menemukan cara untuk membuatnya bekerja dengan ikal. Saya mencoba Host-Header dan --resolve, tidak berhasil, bantuan apa pun dihargai.
Namun, ini berfungsi dalam ikal, jika saya set ke
sebagai gantinya. (Yang tidak berfungsi dengan Firefox.)
sumber
Detail penting lainnya, yang kedaluwarsa = harus menggunakan format waktu tanggal berikut: Wdy, DD-Mon-YYYY HH: MM: SS GMT ( RFC6265 - Bagian 4.1.1 ).
sumber
Setelah banyak bereksperimen dan membaca berbagai posting, ini berhasil. Saya dapat mengatur beberapa cookie, membacanya kembali dan mengatur waktu negatif dan menghapusnya.
sumber
Satu-satunya hal yang berhasil bagi saya adalah mengatur
Path=/
cookie.Selain itu, nilai default atribut path tampaknya berbeda dari peramban ke peramban meskipun saya hanya menguji dua di antaranya (Firefox dan Chrome).
Chrome mencoba mengatur cookie apa adanya; jika
path
atribut dihilangkan dalamSet-Cookie
header maka itu tidak akan disimpan dan diabaikan.Namun, Firefox menyimpan cookie bahkan tanpa
path
atribut eksplisit . Itu hanya mengaturnya dengan jalur yang diminta; url permintaan saya adalah/api/v1/users
dan jalur disetel/api/v1
secara otomatis.Pokoknya, kedua browser berfungsi ketika
path
disetel ke/
bahkan tanpa domain eksplisit, yaituDomain=localhost
atau sesuatu. Jadi ada beberapa perbedaan dalam cara masing-masing browser menangani cookie.sumber