[英]How do I delete PHPSESSID on client computers
更新問題:
setcookie ("PHPSESSID", $_COOKIE['PHPSESSID'], time() - 864000, '/', 'www.mywebsite.com');
但這失敗了。 setcookie ("PHPSESSID", $_COOKIE['PHPSESSID'], time() - 864000, '/');
導致我設置的PHPSESSID被刪除。 session_name
重命名我設置的SESSION。 這可以工作,但幾分鍾后幾次崩潰了我的服務器。 我正在我的網站上使用PHP會話。
會話路徑是/文件夾,稍后我改為/以適應新目的。
現在,老用戶無法登錄。
看起來他們現在有兩個PHPSESSID存儲在他們的瀏覽器上 - 一個帶有路徑/文件夾,另一個帶有/。
我該怎么做才能確保舊用戶可以登錄,同時確保會話在整個網站范圍內使用“/”。
更多信息
當我說兩個phpsessionid時,請參考圖像
A. session_set_cookie_params(864000, '/cv', '.website.com', 0, 1);
但如果我使用,則無法工作:
B. session_set_cookie_params(864000, '/', '.website.com', 0, 1);
使用JAVASCRIPT刪除PHPSESSID的更新
使用PHP刪除PHPSESSID的更新
var_dump($_COOKIE['PHPSESSID']);
返回的是具有path / cv的PHPSESSID的值 setcookie ("PHPSESSID", "", time() - 3600);
刪除setcookie ("PHPSESSID", "", time() - 3600);
失敗。 我認為你正在混淆事情,或者你應該詳細了解你的設置/問題。
PHP的會話路徑是會話數據存儲在服務器上的位置,而不是客戶端。 請參閱文檔: https : //secure.php.net/manual/en/session.configuration.php#ini.session.save-path
您可以移動這些文件並在發生碰撞時替換/保留您認為合適的方式。 這幾乎只受訪問/移動內容時的讀/寫權限以及您的web服務器用戶(例如apache或nginx)或php-user用於從/向新位置讀取/寫入它們所限制。
如果通過“瀏覽器中的PHPSESSID”表示會話ID是您的網址的一部分,這是一個不同的PHP設置,無論如何應該禁用,請參閱文檔中的注意事項: https : //secure.php.net/manual /en/session.configuration.php#ini.session.use-trans-sid
根據您更新的問題進行修改:
已經有一個很好的基於JS的解決方案,用於使舊cookie過期。 我會那樣做的。 如果你不能這樣做,你可以重定向到/cv
有一個php腳本在那里讀取cookie並將數據存儲在某個地方(例如基於user_id的數據庫)並使cookie過期。 然后,您可以重定向到舊頁面,查找“/” - cookie並恢復數據。 這是一個非常丑陋的黑客,但我不認為你可以在PHP中獲取每個路徑的cookie,因為它是服務器端並且基於客戶端提供的會話ID(但我可能是錯的)。
我只是從/folder
過期cookie。 這應該只留下一個會話cookie /
setcookie('PHPSESSID', '', time() - 86400, '/folder/');
您可以在session_start()之前使用session_name()更改新會話的cookie名稱,並讓問題在幾天后自行解決。
session_name("SESSION_ID");
session_start();
您必須在客戶端刪除cookie。 使用javascript可以實現這一點。
在您的網站上試試這個javascript:
<script type="text/javascript">
document.cookie = "PHPSESSID=;Path=/cv;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
</script>
一個例子:
對於此示例,請使用站點https://developer.mozilla.org/en-US/ 。
如果我在cookie上加載此站點,則有以下條目 現在我想刪除名為dwf_section_edit
的cookie。 要刪除此cookie,我將過期日期設置為過去。 我執行后
document.cookie = "dwf_section_edit=;Path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
在控制台上,cookie就像你在下面的圖像上看到的那樣(我使用了表左下方的小刷新按鈕,因為它只是在這個例子中是臨時的)
在下一次重新加載時,我在這個例子中再次獲取cookie,因為Mozilla會將它還給我。 在您的網站上,您不必再次創建舊cookie,一切都很好。
我想你的腳本不知道,在session_start()時應該訪問哪個會話;
嘗試為會話指定正確的路徑
ini_set('session.cookie_path', '/');
要么
session_start(['cookie_path' => '/']);
取決於您的設置
如果這沒有幫助,我建議使用session_regenerate_id() ,它將用新的會話ID替換當前的會話ID,並保留當前的會話信息。
解決方案是讓用戶在會話到期時間內轉到/文件夾路徑。 在這條路徑上創建php腳本,使用setcookie函數將所有COOKIES從/文件夾復制到/ path( http://php.net/manual/ro/function.setcookie.php )
foreach ($_COOKIE as $key => $value) {
setcookie($key, $value, $expire, "/")
}
// redirect to "/" now. User will be able to login.
補充說明:cookie與路徑和域綁定,其重要性(默認為/ ,但似乎不適用於您的情況)。 所以來自子路徑(如/ folder或/ me)的PHPSESSID無法從父級訪問。 他們從父母傳播到孩子。 所以來自/我的 cookie與沒有明確分配的/相同。
如果手動發送包含所需路徑的新過期日期的標題,則客戶端應將其刪除。
session_start();
header("Set-Cookie:PHPSESSID=".session_id()."; expires=Sat, 07-Nov-1999 14:58:07 GMT; path=/cv/");
第一次,你有舊的cookie路徑,但從第二頁調用只有路徑/
的cookie將被存儲和傳輸。
當您知道客戶端是否受此問題影響或者持續一個月時,您可以發送此標頭。
是的,你需要將cookie時間設置為負值,以便瀏覽器可以刪除它,在adition中我們將存儲的值設置為空字符串,這也有助於刪除相同的cookie ...
這個(頁面的頂部)可以做,只需確保session_start()
首先:
setcookie('PHPSESSID', '', -3600, '/cv');
這在我的所有域名上完美運行,我曾經遇到過這個問題。
您可以通過將其設置為之前的過期來將其刪除:
setcookie('phpsessid','value',time()-1);
調用setcookie
函數時只需提供第4個參數:
setcookie ("PHPSESSID", "", time() - 3600, '/');
說明
setcookie()
函數的第四個參數是要設置的會話的$path
。 為此,“默認值是設置cookie的當前目錄。”。 (參見: http : //php.net/manual/en/function.setcookie.php 。)因此,如果您從位於文件夾“/ folder”的文件中調用此函數,它將嘗試從該文件夾中刪除cookie只要。 通過將$path
設置為“/”,我們告訴函數從根目錄中刪除session_id。
我測試了它,它成功地從cookie中刪除了PHPSESSID
。
這里提到了 ,雖然不推薦使用session_register()並且首選使用$ _SESSION: -
如果在調用此函數之前未調用session_start(),則將對沒有參數的session_start()進行隱式調用。 $ _SESSION不會模仿此行為,並且在使用前需要session_start()。
然后,使用$ _SESSION,使用Auth = True附加一個JSON文件,TimeOut = 20分鍾。
每當用戶注銷或超時后,設置Auth = False。 然后,使用PHP和。讀取該JSON文件
然后,如果Auth = False,則使用PHP創建JS,即OnLoad事件, document.cookie = 'PHPSESSID' + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;';
讓我們回到基礎 - 這是我認為你應該嘗試的東西:運行你的網站。 記下PHPSESSID。 然后完全關閉瀏覽器,再次打開瀏覽器,然后運行您的站點。 檢查PHPSESSID並查看它是否相同。
如果它不相同則不是cookie而是特定於瀏覽器會話的會話ID。 其次,如果PHPSESSID與第一次設置相同,那么它就是一個cookie,您將能夠刪除任何設置為cookie資源的key => value對。 可能是你在JS或PHP代碼中引用了一些錯誤的東西。
請嘗試這個並恢復結果。 它將提供更多的清晰度。 Sessions,LocalStorage,IndexDB,Cookies都是不同的東西,並以不同的方式引用。
首先要了解的是,您無法以任何方式刪除客戶端系統上的COOKIES
。 當您無效時,瀏覽器不會刪除它,但會使cookie無效。 cookie仍然存在於客戶端系統上。 但瀏覽器只是忽略它。 為了刪除它,客戶端必須自己完成。
要使您可以使用的所有會話無效
session_start(); // initialize session
session_destroy(); // destroy session
setcookie("PHPSESSID","",time()-3600,"/"); // delete session cookie
或javascript代碼:
document.cookie = "PHPSESSID=; expires=Thu, 01 Jan 1970 00:00:00
UTC;path=/;host=localhost";
在每種情況下,您都無法刪除瀏覽器設置的cookie。 因為PHP和javascript只能發出命令,只會使已經設置的cookie無效。
由客戶自己。
刷新cookie和緩存的方向
卸載瀏覽器,然后重新安裝。
創建一個新的PHP腳本並將其插入login.php的頂部,並在此腳本中檢查是否有兩個PHPSessionId,如果有兩個,則銷毀所有這些並重新加載頁面。 直到您重新加載在任何事件將在會話之前使用的最后一個cookie。 您必須重新加載頁面或重定向使用:
刪除兩個PHPSESSID
count=0;
foreach($_COOKIE as $key => $value){
if ( $key == "PHPSESSID" ){
count++;
}
}
if (count>1){
//Destory all cookies here
foreach($_COOKIE as $key => $value){
setcookie($key,"",time()-3600,"/");
}
//Reload/redirect the current page to dispose of all things
header("Locations:" . $your_url);
exit(0);
}
現在每種情況下只會有一次PHPSESSID會話
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.