Saya mengganti cookie dengan localStorage di browser yang dapat mendukungnya (siapa pun kecuali IE). Masalahnya adalah site.com dan www . site.com menyimpan objek localStorage mereka sendiri yang terpisah. Saya yakin www dianggap sebagai subdomain (keputusan bodoh jika Anda bertanya kepada saya). Jika pengguna awalnya di site.com dan memutuskan untuk mengetik www . site.com pada kunjungan berikutnya, semua data pribadinya tidak dapat diakses. Bagaimana cara agar semua "subdomain" saya berbagi penyimpanan lokal yang sama dengan domain utama?
101
Jawaban:
Beginilah cara saya menggunakannya di seluruh domain ...
Saya harap ini membantu :)
sumber
site.com
/www.site.com
selama subdomain berada di domain induk yang samaJika Anda menggunakan solusi iframe dan postMessage hanya untuk masalah khusus ini, menurut saya mungkin akan kurang berhasil (baik dari segi kode maupun komputasi) untuk hanya menyimpan data dalam cookie tanpa subdomain dan, jika belum di localStorage saat dimuat, ambil dari cookie .
Kelebihan:
Kekurangan:
Saya setuju dengan pemberi komentar lain, sepertinya ini harus menjadi opsi yang dapat ditentukan untuk Penyimpanan lokal sehingga penyelesaian tidak diperlukan.
sumber
Saya sarankan membuat pengalihan site.com ke www.site.com untuk konsistensi dan menghindari masalah seperti ini.
Selain itu, pertimbangkan untuk menggunakan solusi lintas-browser seperti PersistJS yang dapat menggunakan penyimpanan asli setiap browser.
sumber
Location
, atau melalui<meta>
tag HTML, atau bahkan melalui JSwindow.location
.Setel ke cookie di domain utama -
document.cookie = "key=value;domain=.mydomain.com"
dan kemudian mengambil data dari domain utama atau sub domain dan mengaturnya di penyimpanan lokal
sumber
Saya menggunakan xdLocalStorage, ini adalah pustaka js ringan yang mengimplementasikan antarmuka LocalStorage dan mendukung penyimpanan lintas domain dengan menggunakan komunikasi pesan pos iframe. (Dukungan angularJS)
https://github.com/ofirdagan/cross-domain-local-storage
sumber
Begini caranya:
[ Pembaruan November 2020: Solusi ini bergantung pada kemampuan untuk mengatur
document.domain
. Sayangnya, kemampuan untuk melakukan itu sekarang sudah ditinggalkan.]Untuk berbagi antar subdomain dari superdomain tertentu (misalnya example.com), ada teknik yang dapat Anda gunakan dalam situasi itu. Hal ini dapat diterapkan untuk
localStorage
,IndexedDB
,SharedWorker
,BroadcastChannel
, dll, semua yang menawarkan fungsionalitas dibagi antara halaman yang sama-asal, tapi untuk beberapa alasan tidak menghormati modifikasi apapun untukdocument.domain
yang akan membiarkan mereka menggunakan superdomain sebagai asal-usul mereka langsung.(1) Pilih satu domain "utama" untuk menyimpan data: yaitu https://example.com atau https://www.example.com akan menyimpan data localStorage Anda. Katakanlah Anda memilih https://example.com .
(2) Gunakan localStorage biasanya untuk halaman domain yang dipilih itu.
(3) Di semua halaman https://www.example.com ( domain lain ), gunakan javascript untuk menyetel
document.domain = "example.com";
. Lalu buat juga yang tersembunyi<iframe>
, dan navigasikan ke beberapa halaman di domain https://example.com yang dipilih ( Tidak masalah halaman apa , selama Anda dapat memasukkan sedikit cuplikan javascript di sana. Jika Anda ' membuat ulang situs, cukup buat halaman kosong khusus untuk tujuan ini. Jika Anda menulis ekstensi atau skrip pengguna gaya Greasemonkey sehingga tidak memiliki kontrol apa pun atas halaman di example.comserver, cukup pilih halaman paling ringan yang dapat Anda temukan dan masukkan skrip Anda ke dalamnya. Beberapa jenis halaman "tidak ditemukan" mungkin akan baik-baik saja).(4) Skrip di halaman iframe yang tersembunyi hanya perlu (a) set
document.domain = "example.com";
, dan (b) memberi tahu jendela induk ketika ini selesai. Setelah itu, jendela induk dapat mengakses jendela iframe dan semua objeknya tanpa batasan! Jadi halaman iframe minimal adalah seperti:<!doctype html> <html> <head> <script> document.domain = "example.com"; window.parent.iframeReady(); // function defined & called on parent window </script> </head> <body></body> </html>
Jika menulis userscript, Anda mungkin tidak ingin menambahkan fungsi yang dapat diakses secara eksternal seperti
iframeReady()
ke AndaunsafeWindow
, jadi cara yang lebih baik untuk memberi tahu jendela utama userscript adalah dengan menggunakan peristiwa khusus:window.parent.dispatchEvent(new CustomEvent("iframeReady"));
Yang akan Anda deteksi dengan menambahkan listener untuk peristiwa "iframeReady" kustom ke jendela halaman utama Anda.
(CATATAN: Anda perlu menyetel document.domain = "example.com" meskipun domain iframe sudah menjadi example.com : Menetapkan nilai ke document.domain secara implisit menyetel port asal ke null, dan kedua port harus cocok untuk iframe dan induknya dianggap sama-asal. Lihat catatan di sini: https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Changing_origin )
(5) Setelah disembunyikan iframe telah menginformasikan jendela induknya yang sudah siap, naskah di jendela orangtua bisa menggunakan
iframe.contentWindow.localStorage
,iframe.contentWindow.indexedDB
,iframe.contentWindow.BroadcastChannel
,iframe.contentWindow.SharedWorker
bukanwindow.localStorage
,window.indexedDB
, dll ... dan semua benda-benda ini akan scoped untuk yang dipilih https: // example.com asal - jadi mereka akan memiliki asal bersama yang sama ini untuk semua halaman Anda!Bagian paling canggung dari teknik ini adalah Anda harus menunggu iframe dimuat sebelum melanjutkan. Jadi Anda tidak bisa begitu saja mulai menggunakan localStorage di handler DOMContentLoaded Anda, misalnya. Anda juga mungkin ingin menambahkan beberapa penanganan kesalahan untuk mendeteksi jika iframe yang tersembunyi gagal dimuat dengan benar.
Tentunya, Anda juga harus memastikan iframe yang tersembunyi tidak dihapus atau dinavigasi selama masa aktif halaman Anda ... OTOH Saya tidak tahu apa akibatnya, tetapi kemungkinan besar hal-hal buruk akan terjadi.
Dan, peringatan: pengaturan / perubahan
document.domain
dapat diblokir menggunakanFeature-Policy
header, dalam hal ini teknik ini tidak akan dapat digunakan seperti yang dijelaskan.Namun, ada generalisasi yang jauh lebih rumit dari teknik ini, yang tidak dapat diblokir oleh
Feature-Policy
, dan itu juga memungkinkan domain yang sama sekali tidak terkait untuk berbagi data, komunikasi, dan pekerja bersama (yaitu tidak hanya subdomain dari superdomain umum). @ Mayank Jain sudah memaparkannya dalam jawabannya, yaitu:Ide umumnya adalah, seperti di atas, Anda membuat iframe tersembunyi untuk memberikan akses asal yang benar; tetapi alih-alih hanya mengambil properti jendela iframe secara langsung, Anda menggunakan skrip di dalam iframe untuk melakukan semua pekerjaan, dan Anda berkomunikasi antara iframe dan jendela utama Anda hanya menggunakan
postMessage()
danaddEventListener("message",...)
.Ini berfungsi karena
postMessage()
dapat digunakan bahkan di antara jendela asal yang berbeda. Tetapi ini juga jauh lebih rumit karena Anda harus meneruskan semuanya melalui beberapa jenis infrastruktur perpesanan yang Anda buat antara iframe dan jendela utama, daripada hanya menggunakan localStorage, IndexedDB, dll. API langsung di kode jendela utama Anda.sumber
solusi semacam ini menyebabkan banyak masalah seperti ini. untuk pertimbangan konsistensi dan SEO redirect pada domain utama merupakan solusi terbaik.
lakukan pengalihan di tingkat server
Cara Redirect www ke Non-www dengan Nginx
https://www.digitalocean.com/community/tutorials/how-to-redirect-www-to-non-www-with-nginx-on-centos-7
atau level lain seperti rute 53 jika digunakan
sumber
Beginilah cara saya menyelesaikannya untuk situs web saya. Saya mengarahkan ulang semua halaman tanpa www ke www.site.com. Dengan cara ini, ini akan selalu mengambil penyimpanan lokal dari www.site.com
Tambahkan berikut ini ke .htacess Anda , (buat satu jika Anda belum memilikinya) di direktori root
RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
sumber