Bagaimana cara mengatasi masalah kehilangan sesi setelah pengalihan dalam PHP?
Baru-baru ini, saya mengalami masalah yang sangat umum yaitu kehilangan sesi setelah pengalihan. Dan setelah mencari melalui situs web ini saya masih dapat menemukan solusi (walaupun ini yang paling dekat).
Memperbarui
Saya telah menemukan jawabannya dan saya pikir saya akan mempostingnya di sini untuk membantu siapa saja yang mengalami masalah yang sama.
php
session
redirect
session-cookies
shared-hosting
dayuloli
sumber
sumber
Jawaban:
Pertama, lakukan pemeriksaan biasa ini:
session_start();
dipanggil sebelum sesi apa pun dipanggil. Jadi taruhan yang aman adalah dengan meletakkannya di awal halaman Anda, segera setelah<?php
deklarasi pembukaan sebelum yang lain. Juga pastikan tidak ada spasi / tab putih sebelum<?php
deklarasi pembukaan .header
pengalihan, akhiri skrip saat ini menggunakanexit();
(Orang lain juga menyarankansession_write_close();
dansession_regenerate_id(true)
, Anda dapat mencobanya juga, tapi saya akan menggunakanexit();
)register_globals
tidak aktif, Anda dapat memeriksa ini padaphp.ini
file dan juga menggunakanphpinfo()
. Lihat ini sebagai cara mematikannya.$_SESSION
array superglobal Anda tidak ditimpa di mana punwww.yourdomain.com
keyourdomain.com
tidak melanjutkan sesi..php
(itu terjadi!)Sekarang, ini adalah kesalahan paling umum, tetapi jika mereka tidak melakukan trik, masalahnya kemungkinan besar berkaitan dengan perusahaan hosting Anda. Jika semuanya berfungsi
localhost
tetapi tidak pada server remote / pengujian Anda, maka ini kemungkinan besar penyebabnya. Jadi, periksa basis pengetahuan penyedia hosting Anda (juga coba forum mereka dll). Untuk perusahaan seperti FatCow dan iPage, mereka mengharuskan Anda menentukannyasession_save_path
. Jadi seperti ini:(ganti "jalur direktori home Anda" dengan jalur direktori home Anda yang sebenarnya. Ini biasanya ada di panel kontrol Anda (atau yang setara), tetapi Anda juga bisa membuat
test.php
file di direktori root dan ketik:Bit sebelum 'test.php' adalah jalur direktori home Anda. Dan tentu saja, pastikan folder itu benar-benar ada dalam direktori root Anda. (Beberapa program tidak mengunggah folder kosong saat menyinkronkan)
sumber
Anda harus menggunakan "keluar" setelah panggilan header
sumber
echo ' ';
) atau spasi apa pun, itu akan sepenuhnya mengabaikan header lokasi.Saya mencoba semua solusi yang mungkin, tetapi tidak ada yang berhasil! Tentu saja, saya menggunakan layanan hosting bersama.
Pada akhirnya, saya menyelesaikan masalah dengan menggunakan 'url relatif' di dalam header redirect!
membatalkan cookie sesi
bekerja seperti pesona!
sumber
Saya memiliki masalah yang sama. Saya mengerjakannya selama beberapa jam dan itu membuat saya gila.
Dalam kasus saya masalahnya adalah 404 dipanggil karena favicon.ico yang hilang di Chrome dan Firefox saja. Navigator lain bekerja dengan baik.
sumber
Ketika saya menggunakan jalur relatif "dir / file.php" dengan fungsi header () berfungsi untuk saya. Saya pikir sesi tersebut tidak disimpan karena suatu alasan ketika Anda mengarahkan ulang menggunakan url penuh ...
sumber
Ini membuat saya bingung untuk waktu yang lama (dan posting ini sangat bagus untuk ditemukan!) Tetapi bagi siapa pun yang masih tidak bisa mendapatkan sesi antara pengalihan halaman untuk bekerja ... Saya harus masuk ke file php.ini dan menyalakan cookie :
Saya pikir sesi bekerja tanpa cookie ... sebenarnya saya tahu mereka HARUS ... tapi ini memperbaiki masalah saya setidaknya sampai saya bisa mengerti apa yang sedang terjadi di gambar yang lebih besar.
sumber
Saya memiliki masalah yang sama, walaupun konteks saya sedikit berbeda. Saya memiliki pengaturan pengembangan lokal pada mesin yang hostname-nya
windows
dan alamat IP-nya192.168.56.2
.Saya dapat mengakses sistem menggunakan salah satu dari:
Setelah masuk, kode PHP saya akan dialihkan menggunakan:
Jika nama domain sebelumnya yang digunakan untuk mengakses sistem tidak
windows
, data sesi akan hilang. Saya memecahkan ini dengan mengubah kode menjadi:Sekarang berfungsi terlepas dari apa nama domain lokal atau alamat IP yang dimasukkan pengguna.
Semoga ini bermanfaat bagi seseorang.
sumber
Saya mengalami masalah ini pada satu halaman tertentu. Saya menetapkan nilai $ _SESSION di halaman lain tepat sebelum pengalihan dan semuanya bekerja dengan baik. Tetapi halaman khusus ini tidak berfungsi.
Akhirnya saya menyadari bahwa di halaman khusus ini, saya menghancurkan sesi di awal halaman tetapi tidak pernah memulai lagi. Jadi fungsi hancurkan saya berubah dari:
untuk:
Dan semuanya berhasil!
sumber
Saya mengalami masalah yang sama. Tiba-tiba BEBERAPA variabel sesi saya tidak akan bertahan ke halaman berikutnya. Masalahnya ternyata (dalam php7.1) Anda lokasi header tidak harus memiliki WWW di dalamnya, mis https: // mysite . tidak apa-apa, https: //www.mysite . akan kehilangan variabel sesi halaman itu. Tidak semua, hanya halaman itu.
sumber
www.mysite.com
dipandang sebagai domain yang sama sekali berbeda denganblog.mysite.com
atau hanyamysite.com
Saya telah berjuang dengan ini selama berhari-hari, memeriksa / mencoba semua solusi, tetapi masalah saya adalah saya tidak menelepon
session_start();
lagi setelah pengalihan. Saya hanya berasumsi bahwa sesi itu 'masih hidup'.Jadi jangan lupakan itu!
sumber
Saya memiliki masalah yang sama dan menemukan cara termudah. Saya hanya dialihkan ke .html redirect dengan 1 baris JS
bukannya PHP
Saya harap ini membantu.
Cinta Gram
sumber
Jika Anda menggunakan
session_set_cookie_params()
Anda mungkin ingin memeriksa apakah Anda melewati param keempat$secure
sebagaitrue
. Jika ya, maka Anda perlu mengakses url menggunakan https.The
$secure
param menjadi sarana yang benar Sidang ini hanya tersedia dalam permintaan aman. Ini mungkin lebih memengaruhi Anda secara lokal daripada di lingkungan panggung atau produksi.Menyebutnya karena saya baru saja menghabiskan sebagian besar hari ini berusaha menemukan masalah ini, dan inilah yang memecahkannya untuk saya. Saya baru saja ditambahkan ke proyek ini dan tidak ada yang menyebutkan bahwa itu memerlukan https.
Jadi Anda bisa menggunakan https secara lokal, atau Anda dapat mengatur
$secure
paramFALSE
dan kemudian menggunakan http secara lokal. Pastikan untuk mengembalikannya ke true saat Anda mendorong perubahan.Tergantung pada server lokal Anda, Anda mungkin harus mengedit
DocumentRoot
dihttpd-ssl.conf
server sehingga url lokal Anda disajikan https.sumber
Alasan lain yang mungkin:
Itu adalah ruang penyimpanan server saya. Ruang disk server saya menjadi penuh. Jadi, saya telah menghapus beberapa file dan folder di server saya dan mencoba.
Itu berhasil !!!
Saya menyimpan sesi saya di AWS Dynamo DB, tetapi masih mengharapkan beberapa ruang di server saya untuk memproses sesi. Tidak yakin kenapa !!!
sumber
Jika Anda menggunakan Laravel dan Anda mengalami masalah ini, yang Anda butuhkan adalah menyimpan data sesi Anda sebelum mengarahkan.
sumber
Saya juga memiliki masalah yang sama dengan pengalihan tidak berfungsi dan mencoba semua solusi yang bisa saya temukan, pengalihan header saya sedang digunakan dalam formulir.
Saya memecahkannya dengan meletakkan redirect header di halaman php yang berbeda 'signin_action.php' dan meneruskan parameter variabel melalui yang saya inginkan dalam parameter url dan kemudian menugaskannya kembali dalam bentuk 'signin_action.php'.
signin.php
signin_action.php
Ini bukan solusi yang bagus tapi berhasil.
sumber
Bagi saya kesalahannya adalah bahwa saya mencoba untuk menyimpan objek yang tidak dapat diubah dalam sesi sehingga pengecualian dilemparkan ketika mencoba menulis sesi. Tetapi karena semua kode penanganan kesalahan saya sudah berhenti operasi saya tidak pernah melihat kesalahan.
Saya bisa menemukannya di log kesalahan Apache.
sumber
Sekadar catatan ... Saya mengalami masalah ini dan setelah beberapa jam mencoba semua masalahnya masalahnya adalah disk sudah penuh, dan sesi php tidak dapat ditulis ke dalam direktori tmp ... jadi jika Anda memiliki masalah ini periksa bahwa terlalu...
sumber
www
) sehingga melakukanchown -R www.www
pada folder sesi memperbaiki masalah.Bagi saya, Firefox telah menyimpan ID sesi (PHPSESSID) dalam cookie, tetapi Google Chrome telah menggunakan parameter GET atau POST. Jadi, Anda hanya perlu memastikan bahwa skrip yang kembali (untuk saya: checkout paypal) melakukan PHPSESSID di url atau parameter POST.
sumber
Setelah mencoba banyak solusi di sini di SO dan blog lain ... yang berhasil bagi saya adalah menambahkan .htaccess ke root situs web saya.
sumber
Jika Anda menggunakan Wordpress, saya harus menambahkan hook ini dan memulai sesi di init:
sumber
Tidak ada yang berhasil untuk saya, tetapi saya menemukan apa yang menyebabkan masalah (dan menyelesaikannya):
Periksa cookie browser Anda dan pastikan tidak ada cookie sesi php pada subdomain yang berbeda (seperti satu untuk " www.website.com " dan satu untuk " situs web.com ").
Ini disebabkan oleh javascript yang salah menggunakan subdomain untuk mengatur cookie dan membuka halaman di iframe.
sumber
Pertama-tama, pastikan Anda menelepon
session_start()
sebelum menggunakan$_SESSION
variabel.Jika Anda telah menonaktifkan pelaporan kesalahan, coba nyalakan dan lihat hasilnya.
Alasan paling umum yang tidak disebutkan dalam jawaban @ dayuloli:
Masalah ruang disk. Pastikan ruang disk Anda tidak penuh, Anda perlu ruang untuk menyimpan file sesi.
Direktori sesi mungkin tidak dapat ditulisi. Anda dapat memeriksanya
is_writable(session_save_path())
sumber
Saya mengalami masalah yang sama dan saya pergi mencari kode untuk mencari jawabannya. Akhirnya saya menemukan hosting saya baru-baru ini memperbarui versi PHP di server saya dan tidak benar mengatur
session_save_path
parameter padaphp.ini
file.Jadi, jika seseorang membaca ini, silakan periksa
php.ini
konfigurasi sebelum hal lain.sumber
Pastikan
session_write_close
tidak dipanggil antarasession_start()
dan ketika Anda mengatur sesi Anda.sumber
Sekarang GDPR adalah suatu hal, orang yang mengunjungi pertanyaan ini mungkin menggunakan skrip cookie. Nah, skrip itu yang menyebabkan masalah bagi saya. Rupanya, PHP menggunakan cookie yang dipanggil
PHPSESSID
untuk melacak sesi. Jika skrip itu menghapusnya, Anda kehilangan data Anda.Saya menggunakan skrip cookie ini . Ini memiliki opsi untuk mengaktifkan cookie "esensial". saya tambahkan
PHPSESSID
ke daftar, skrip berhenti menghapus cookie, dan semuanya mulai berfungsi lagi.Anda mungkin bisa mengaktifkan beberapa pengaturan PHP untuk menghindari penggunaan
PHPSESSID
, tetapi jika skrip cookie Anda adalah penyebab masalah, mengapa tidak memperbaiki itu .sumber
Saya memperbaiki masalah ini setelah beberapa hari melakukan debugging dan itu semua karena URL saya yang kembali dari PayPal Express Checkout tidak memiliki 'www'. Chrome mengakui bahwa domain harus diperlakukan sama tetapi browser lain terkadang tidak. Saat menggunakan sesi / cookie dan jalur absolut, jangan lupa 'www'!
sumber
Saya memperbaikinya dengan memberikan izin menulis grup ke jalur tempat PHP menyimpan file sesi. Anda dapat menemukan jalur sesi dengan fungsi session_save_path ().
sumber
Hari ini saya mengalami masalah ini dalam sebuah proyek dan saya harus mengubah parameter ini menjadi false (atau menghapus baris, secara default dinonaktifkan):
Ini terjadi karena proyek yang sebenarnya berfungsi lebih dari http dan bukan hanya https. Temukan info lebih lanjut di dokumen http://php.net/manual/en/session.security.ini.php
sumber
Terlambat untuk menjawab tetapi ini berhasil untuk saya
sumber
Bagi saya ini adalah kesalahan izin dan ini menyelesaikannya:
Saya telah menguji beberapa jam di PHP dan tes terakhir yang saya lakukan adalah saya membuat dua file session1.php dan session2.php.
session1.php:
session2.php:
dan itu mencetak array kosong.
Pada titik ini, saya pikir itu bisa menjadi masalah server dan pada kenyataannya, itu.
Semoga ini bisa membantu seseorang.
sumber