เซสชัน PHP หายไปหลังจากเปลี่ยนเส้นทาง


132

ฉันจะแก้ไขปัญหาการสูญเสียเซสชันหลังจากเปลี่ยนเส้นทางใน PHP ได้อย่างไร

เมื่อเร็ว ๆ นี้ฉันพบปัญหาที่พบบ่อยมากเกี่ยวกับการสูญเสียเซสชันหลังจากเปลี่ยนเส้นทาง และหลังจากการค้นหาผ่านทางเว็บไซต์นี้ฉันยังคงสามารถหาทางออกไม่ (แม้ว่านี้มาที่ใกล้เคียงที่สุด)

ปรับปรุง

ฉันพบคำตอบแล้วและคิดว่าจะโพสต์ไว้ที่นี่เพื่อช่วยเหลือผู้ที่ประสบปัญหาเดียวกัน


1
คำถามคือวิธีแก้ไขปัญหาการสูญเสียเซสชันหลังจากเปลี่ยนเส้นทางใน PHP ฉันหาคำตอบได้แล้วเพียงโพสต์ที่นี่เพื่อให้คนอื่นรู้ เนื่องจากโซลูชันของฉันไม่ได้อยู่ใน StackOverflow
dayuloli

2
ไม่เป็นไร แต่นี่เป็นไซต์ QA กรุณาตั้งคำถามของคุณเป็นคำถาม
jeremy

ฉันไม่ได้สังเกตว่ามันมาจากคุณ อย่างไรก็ตามไซต์นี้มีไว้สำหรับคำถามไม่ใช่สำหรับคำตอบสำหรับคำถามที่คุณรู้อยู่แล้ว
Aris


21
@Aris ไม่เป็นความจริงเมื่อผู้คนมีคำถามเกี่ยวกับการเข้ารหัสพวกเขามาที่ StackOverflow เพื่อขอความช่วยเหลือ หากไม่มีคำตอบก็จะไม่ได้รับความช่วยเหลือที่ต้องการ ฉันพยายามให้คำตอบนั้น
dayuloli

คำตอบ:


209

ขั้นแรกให้ดำเนินการตรวจสอบตามปกติเหล่านี้:

  1. ตรวจสอบให้แน่ใจว่าsession_start();ถูกเรียกก่อนที่จะมีการเรียกเซสชันใด ๆ ดังนั้นการเดิมพันที่ปลอดภัยคือการวางไว้ที่จุดเริ่มต้นของหน้าเว็บทันทีหลังจากการ<?phpประกาศเปิดก่อนสิ่งอื่นใด ตรวจสอบให้แน่ใจว่าไม่มีช่องว่าง / แท็บก่อนการ<?phpประกาศเปิด
  2. หลังจากheaderเปลี่ยนเส้นทางแล้วให้สิ้นสุดสคริปต์ปัจจุบันโดยใช้exit();(มีคนอื่นแนะนำsession_write_close();และsession_regenerate_id(true)คุณสามารถลองใช้สิ่งเหล่านี้ได้เช่นกัน แต่ฉันจะใช้exit();)
  3. ตรวจสอบให้แน่ใจว่าได้เปิดใช้งานคุกกี้ในเบราว์เซอร์ที่คุณใช้เพื่อทดสอบ
  4. ตรวจสอบให้แน่ใจว่าregister_globalsปิดอยู่คุณสามารถตรวจสอบสิ่งนี้ในphp.iniไฟล์และใช้ไฟล์phpinfo(). อ้างถึงนี้เป็นวิธีการที่จะปิด
  5. ตรวจสอบว่าคุณไม่ได้ลบหรือทำให้เซสชันว่างเปล่า
  6. ตรวจสอบให้แน่ใจว่าคีย์ใน$_SESSIONอาร์เรย์ superglobal ของคุณไม่ได้ถูกเขียนทับที่ใดก็ได้
  7. ตรวจสอบว่าคุณเปลี่ยนเส้นทางไปยังโดเมนเดียวกัน ดังนั้นการเปลี่ยนเส้นทางจาก a www.yourdomain.comถึงyourdomain.comจะไม่ส่งต่อเซสชันไปข้างหน้า
  8. ตรวจสอบให้แน่ใจว่านามสกุลไฟล์ของคุณคือ.php(มันเกิดขึ้น!)

ตอนนี้สิ่งเหล่านี้เป็นข้อผิดพลาดที่พบบ่อยที่สุด แต่ถ้าพวกเขาไม่ได้ทำตามเคล็ดลับปัญหามักจะเกิดกับ บริษัท โฮสติ้งของคุณ หากทุกอย่างทำงานlocalhostได้ แต่ไม่ได้อยู่บนเซิร์ฟเวอร์ระยะไกล / การทดสอบของคุณสิ่งนี้น่าจะเป็นตัวการ ดังนั้นตรวจสอบฐานความรู้ของผู้ให้บริการโฮสติ้งของคุณ (ลองใช้ฟอรัมของพวกเขาเป็นต้น) สำหรับ บริษัท เช่น FatCow และ iPage session_save_pathพวกเขาต้องการให้คุณระบุ เป็นเช่นนี้:

session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();

(แทนที่ "เส้นทางโฮมไดเร็กทอรีของคุณ" ด้วยพา ธ โฮมไดเร็กทอรีจริงของคุณซึ่งโดยปกติจะอยู่ภายในแผงควบคุมของคุณ (หรือเทียบเท่า) แต่คุณยังสามารถสร้างtest.phpไฟล์บนไดเร็กทอรีรากของคุณและพิมพ์:

<?php echo $_SERVER['SCRIPT_FILENAME']; ?>

บิตก่อน 'test.php' คือพา ธ โฮมไดเร็กทอรีของคุณ และแน่นอนตรวจสอบให้แน่ใจว่าโฟลเดอร์นั้นมีอยู่จริงในไดเรกทอรีรากของคุณ (บางโปรแกรมไม่อัปโหลดโฟลเดอร์ว่างเมื่อทำการซิงโครไนซ์)


8
+1 ที่เขียนได้ดีมากหากทุกอย่างล้มเหลวเพียงแค่ใช้คุกกี้ (สร้างสตริงแบบสุ่มและเก็บไว้ในฐานข้อมูลและใช้เป็นค่าคุกกี้ของคุณ)
Dave Chen

2
การสลับระหว่าง http และ https อาจเป็นปัญหาstackoverflow.com/questions/441496/…
dev.e.loper

4
โปรดทราบว่าในขณะที่ php 5.4.0 register_globals ถูกลบออกไปแล้วดังนั้นมันจะไม่ทำให้เกิดปัญหาอีกต่อไป
anthonygore

2
ตรวจสอบบันทึกข้อผิดพลาดของเว็บเซิร์ฟเวอร์ด้วย ในกรณีของฉันเกิดข้อผิดพลาด "ล้มเหลวในการเขียนข้อมูลเซสชัน (ไฟล์) โปรดตรวจสอบว่าการตั้งค่าปัจจุบันของ session.save_path ถูกต้อง" สิทธิ์ไม่ถูกต้องในไดเร็กทอรี save_path
timbonicus

เหตุผลใดที่เซสชันของฉันจะถูกเก็บไว้ที่อื่นที่ไม่ใช่ใน session.save_path?
Justin

26

คุณควรใช้ "exit" หลังการโทรส่วนหัว

header('Location: http://www.example.com/?blabla=blubb');
exit;

มีข้อบกพร่องสำหรับ Gecko (เช่น Waterfox, Firefox, SeaMonkey) ซึ่งหากมีข้อมูลออก (เช่นecho ' ';) หรือช่องว่างใด ๆ จะไม่สนใจส่วนหัวของตำแหน่งโดยสิ้นเชิง
John

18

ฉันลองใช้วิธีแก้ปัญหาที่เป็นไปได้ทั้งหมดแล้ว แต่ไม่มีใครได้ผล แน่นอนฉันใช้บริการโฮสติ้งที่ใช้ร่วมกัน

ในที่สุดฉันก็สามารถแก้ปัญหาได้โดยใช้ 'relative url' ในส่วนหัวการเปลี่ยนเส้นทาง!

header("location: http://example.com/index.php")

ทำให้คุกกี้เซสชันเป็นโมฆะ

header("location: index.php")

ทำงานอย่างมีเสน่ห์!


7

ผมมีปัญหาเหมือนกัน. ฉันทำงานกับมันมาหลายชั่วโมงและมันทำให้ฉันแทบคลั่ง

ในกรณีของฉันปัญหาคือ 404 ที่เรียกว่าเนื่องจากfavicon.ico หายไปใน Chrome และ Firefox เท่านั้น นักเดินเรือคนอื่น ๆ ทำงานได้ดี


แค่อยากจะขอบคุณสำหรับคำตอบนี้ทำให้ฉันรู้ว่าการร้องขอ 404 สำหรับรูปภาพถูกส่งต่อโดย Varnish ไปยัง PHP โดยไม่มีคุกกี้ใด ๆ และทำให้มีการสร้างเซสชันใหม่อย่างต่อเนื่อง อาจไม่เคยคิดออกโดยไม่มีคุณ
Pascal Zajac

ฉันมีปัญหาเดียวกันคือ favicon.ico ของฉันกำลังถูกเปลี่ยนเส้นทาง (302 เปลี่ยนเส้นทางจากโดเมนย่อยไปยังโดเมนหลัก) ดังนั้นจึงสร้างเซสชันใหม่ทุกครั้ง ขอบคุณมาก!
simdrouin

4

เมื่อฉันใช้เส้นทางสัมพัทธ์ "dir / file.php" ด้วยในฟังก์ชัน header () ในการทำงานสำหรับฉัน ฉันคิดว่าเซสชันไม่ได้รับการบันทึกด้วยเหตุผลบางประการเมื่อคุณเปลี่ยนเส้นทางโดยใช้ url แบบเต็ม ...

//Does retain the session info for some reason
header("Location: dir");

//Does not retain the session for some reason
header("Location: https://mywebz.com/dir")

3

สิ่งนี้ทำให้ฉันนิ่งงันมานาน (และโพสต์นี้ก็น่าค้นหามาก!) แต่สำหรับใครก็ตามที่ยังไม่สามารถรับเซสชันระหว่างการเปลี่ยนเส้นทางเพจไปทำงานได้ ... ฉันต้องเข้าไปในไฟล์ php.ini แล้วเปิดคุกกี้ :

session.use_cookies = 1 

ฉันคิดว่าเซสชันทำงานได้โดยไม่มีคุกกี้ ... อันที่จริงฉันรู้ว่าพวกเขาควรจะ ... แต่สิ่งนี้ช่วยแก้ปัญหาของฉันได้อย่างน้อยก็จนกว่าฉันจะเข้าใจสิ่งที่อาจเกิดขึ้นในภาพรวม


ฉันไม่รู้ว่าเซสชันสามารถทำงานได้โดยไม่ต้องใช้คุกกี้! เรียนรู้สิ่งใหม่ ๆ ทุกวัน! programmerinterview.com/index.php/php-questions/…
dayuloli

แน่นอนว่าสามารถทำงานได้โดยไม่ต้องใช้คุกกี้ขึ้นอยู่กับการกำหนดค่าของคุณ แต่คุณควรรู้ว่าคุณทำอะไร และมีเหตุผลที่ดีในการทำเช่นนั้น เพราะมีความปลอดภัยน้อย และในกรณีที่คุณต้องทำงานเพื่อเหตุผลที่ไม่มีคุกกี้ อย่างน้อยคุณควรกำหนดค่า ini_set ('session.use_strict_mode', '1'); และโดยทั่วไปจะมีเวลาเซสชันสั้น ๆ และหลังจากผู้ใช้เข้าสู่ระบบให้ใช้ session_regenerate_id () แต่ขอเตือนหากผู้ใช้บางรายโพสต์ลิงก์ไปยังไซต์บนเซิร์ฟเวอร์ของคุณในฟอรัมผู้ที่คลิกลิงก์นี้จะเข้ารับช่วงเซสชัน บางทีการตรวจสอบ ip ก็เป็นความคิดที่ดีเช่นกัน
Michael

3

ฉันมีปัญหาที่คล้ายกันแม้ว่าบริบทของฉันจะแตกต่างกันเล็กน้อย ผมได้มีการติดตั้งการพัฒนาท้องถิ่นในเครื่องที่มีชื่อโฮสต์เป็นwindowsและที่อยู่ IP 192.168.56.2เป็น

ฉันสามารถเข้าถึงระบบโดยใช้อย่างใดอย่างหนึ่ง:

หลังจากเข้าสู่ระบบรหัส PHP ของฉันจะเปลี่ยนเส้นทางโดยใช้:

header('http://windows/');

หากไม่ได้ใช้ชื่อโดเมนก่อนหน้านี้เพื่อเข้าถึงระบบwindowsข้อมูลเซสชันจะหายไป ฉันแก้ไขสิ่งนี้โดยเปลี่ยนรหัสเป็น:

header('http://'.$_SERVER['HTTP_HOST'].'/');

ขณะนี้ใช้งานได้โดยไม่คำนึงถึงชื่อโดเมนท้องถิ่นหรือที่อยู่ IP ที่ผู้ใช้ใส่ไว้

ฉันหวังว่านี่อาจเป็นประโยชน์กับใครบางคน


3

ฉันพบปัญหานี้ในหน้าใดหน้าหนึ่ง ฉันตั้งค่า $ _SESSION ในหน้าอื่น ๆ ก่อนที่จะเปลี่ยนเส้นทางและทุกอย่างก็ทำงานได้ดี แต่หน้านี้ใช้งานไม่ได้

ในที่สุดฉันก็รู้ว่าในหน้านี้ฉันกำลังทำลายเซสชันที่จุดเริ่มต้นของหน้า แต่ไม่เคยเริ่มต้นอีกครั้ง ดังนั้นฟังก์ชันการทำลายของฉันจึงเปลี่ยนจาก:

function sessionKill(){

    session_destroy();

}

ถึง:

function sessionKill(){

    session_destroy();
    session_start();

}

และทุกอย่างได้ผล!


3

ฉันมีปัญหาเดียวกัน ทันใดนั้นตัวแปรเซสชันบางตัวของฉันจะไม่คงอยู่ในหน้าถัดไป ปัญหาเปิดออกมาเป็น (ใน php7.1) คุณหัวตั้งต้องไม่มีรายละเอียดในนั้นอดีตhttps: // mysite ก็โอเคhttps: //www.mysite . จะสูญเสียตัวแปรเซสชันของหน้านั้น ไม่ใช่ทั้งหมดแค่หน้านั้น


นั่นเป็นเพราะ www.mysite.comถูกมองว่าเป็นโดเมนที่แตกต่างไปจากเดิมblog.mysite.comอย่างmysite.com
สิ้นเชิง

2

ฉันดิ้นรนกับเรื่องนี้มาหลายวันตรวจสอบ / ลองวิธีแก้ปัญหาทั้งหมด แต่ปัญหาของฉันคือฉันไม่ได้โทรsession_start();อีกครั้งหลังจากเปลี่ยนเส้นทาง ฉันแค่สันนิษฐานว่าเซสชั่นนั้น 'ยังมีชีวิตอยู่'

อย่าลืมว่า!


ใช่ นี่เป็นปัญหาของฉันด้วย ฉันคิดว่าการเริ่มเซสชัน PHP ก็เหมือนกับการเปิดไฟให้บ้านทั้งหลัง ฉันไม่รู้ว่าคุณต้องเปิดสวิตช์สำหรับแต่ละห้องที่คุณเข้าไป
Dale Thompson

1

ฉันมีปัญหาเดียวกันและพบวิธีที่ง่ายที่สุด ฉันเพิ่งเปลี่ยนเส้นทางไปยัง. html ที่มี JS 1 บรรทัด

<!DOCTYPE html>
<html>
<script type="text/javascript">
<!--
window.location = "admin_index.php";
//–>
</script>
</html>

แทน PHP

header_remove();
header('Location: admin_login.php');
die;

ฉันหวังว่านี่จะช่วยได้.

รักแกรม


1

หากคุณใช้session_set_cookie_params()คุณอาจต้องการตรวจสอบว่าคุณกำลังส่งพารามิเตอร์ที่สี่$secureเป็นtrue. หากคุณเป็นคุณจะต้องเข้าถึง url โดยใช้ https

$secureพระรามเป็นจริงหมายความว่าการประชุมจะใช้ได้เฉพาะภายในคำขอที่เชื่อถือได้ สิ่งนี้อาจส่งผลกระทบต่อคุณในพื้นที่มากกว่าในขั้นตอนหรือสภาพแวดล้อมการใช้งานจริง

ที่พูดถึงเพราะฉันใช้เวลาส่วนใหญ่ในวันนี้ในการค้นหาปัญหานี้และนี่คือสิ่งที่แก้ไขได้สำหรับฉัน ฉันเพิ่งถูกเพิ่มเข้าในโครงการนี้และไม่มีใครพูดถึงว่าต้องใช้ https

ดังนั้นคุณสามารถใช้ https ในเครื่องหรือคุณสามารถตั้งค่า$secureพารามิเตอร์เป็นFALSEแล้วใช้ http ในเครื่อง อย่าลืมตั้งค่ากลับเป็นจริงเมื่อคุณผลักดันการเปลี่ยนแปลง

ขึ้นอยู่กับเซิร์ฟเวอร์ภายในของคุณคุณอาจต้องแก้ไขDocumentRootในhttpd-ssl.confเซิร์ฟเวอร์เพื่อให้ URL ในเครื่องของคุณแสดง https


1

อีกเหตุผลที่เป็นไปได้:

นั่นคือพื้นที่เก็บข้อมูลเซิร์ฟเวอร์ของฉัน พื้นที่ดิสก์เซิร์ฟเวอร์ของฉันเต็ม ดังนั้นฉันได้ลบไฟล์และโฟลเดอร์บางส่วนในเซิร์ฟเวอร์ของฉันและลอง

มันได้ผล !!!

ฉันกำลังบันทึกเซสชันของฉันใน AWS Dynamo DB แต่ยังคงต้องการพื้นที่ในเซิร์ฟเวอร์เพื่อประมวลผลเซสชัน ไม่แน่ใจว่าทำไม !!!


1

หากคุณใช้ Laravel และประสบปัญหานี้สิ่งที่คุณต้องมีคือบันทึกข้อมูลเซสชันของคุณก่อนที่จะเปลี่ยนเส้นทาง

session()->save();
// Redirect the user to the authorization URL.
header('Location: ' . $authorizationUrl);
exit;

0

ฉันยังมีปัญหาเดียวกันกับการเปลี่ยนเส้นทางไม่ทำงานและลองวิธีแก้ปัญหาทั้งหมดที่ฉันพบการเปลี่ยนเส้นทางส่วนหัวของฉันถูกใช้ในรูปแบบ

ฉันแก้ไขได้โดยใส่การเปลี่ยนเส้นทางส่วนหัวในหน้า php อื่น 'signin_action.php' และส่งผ่านพารามิเตอร์ตัวแปรผ่านที่ฉันต้องการในพารามิเตอร์ url จากนั้นกำหนดใหม่ในรูปแบบ 'signin_action.php'

signin.php

if($stmt->num_rows>0) {
$_SESSION['username'] = $_POST['username'];
echo '<script>window.location.href = "http://'.$root.'/includes/functions/signin_action.php?username='.$_SESSION['username'].'";</script>';
error_reporting(E_ALL);

signin_action.php

<?php
require('../../config/init.php');
$_SESSION['username'] = $_GET['username'];
if ($_SESSION['username']) {

echo '<script>window.location.href = "http://'.$root.'/user/index.php";</script>';
exit();
} else {
echo 'Session not set';
}

?>

ไม่ใช่งานที่สวยงาม แต่ได้ผล


0

สำหรับฉันข้อผิดพลาดคือฉันพยายามบันทึกอ็อบเจ็กต์ที่ไม่สามารถใช้งานได้ในเซสชันเพื่อให้เกิดข้อยกเว้นขณะพยายามเขียนเซสชัน แต่เนื่องจากรหัสการจัดการข้อผิดพลาดทั้งหมดของฉันได้หยุดดำเนินการใด ๆ แล้วฉันจึงไม่เคยเห็นข้อผิดพลาด

ฉันสามารถค้นหาได้ในบันทึกข้อผิดพลาดของ Apache แม้ว่า


0

สำหรับการบันทึก ... ฉันมีปัญหานี้และหลังจากลองทุกอย่างไม่กี่ชั่วโมงปัญหาคือดิสก์เต็มและไม่สามารถเขียนเซสชัน php ลงในไดเร็กทอรี tmp ได้ ... ดังนั้นหากคุณมีปัญหานี้ให้ตรวจสอบว่า เกินไป...


คำตอบนี้ใช้ได้ผลสำหรับฉัน เราเรียกใช้ Amazon Machine Image ด้วย nginx ดูเหมือนว่าจะมีข้อผิดพลาดที่โฟลเดอร์เซสชันไม่ได้เป็นของผู้ใช้ที่ถูกต้อง (ในกรณีของเราwww) ดังนั้นการดำเนินการchown -R www.wwwในโฟลเดอร์เซสชันจะช่วยแก้ปัญหาได้
Joshua

0

สำหรับฉัน Firefox ได้เก็บรหัสเซสชัน (PHPSESSID) ไว้ในคุกกี้ แต่ Google Chrome ใช้พารามิเตอร์ GET หรือ POST ดังนั้นคุณต้องตรวจสอบให้แน่ใจว่าสคริปต์ที่ส่งคืน (สำหรับฉัน: paypal checkout) ยอมรับ PHPSESSID ใน url หรือพารามิเตอร์ POST


0

หลังจากลองใช้วิธีแก้ปัญหามากมายใน SO และบล็อกอื่น ๆ ... สิ่งที่ได้ผลสำหรับฉันคือการเพิ่ม. htaccess ในรูทเว็บไซต์ของฉัน

RewriteEngine on
RewriteCond %{HTTP_HOST} ^yoursitename.com$
RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L]

0

หากคุณใช้ Wordpress ฉันต้องเพิ่ม hook นี้และเริ่มเซสชันใน init:

function register_my_session() {
    if (!session_id()) {
        session_start();
    }
}
add_action('init', 'register_my_session');

0

ไม่มีอะไรได้ผลสำหรับฉัน แต่ฉันพบสิ่งที่ทำให้เกิดปัญหา (และแก้ไขได้):

ตรวจสอบคุกกี้เบราว์เซอร์ของคุณและตรวจสอบให้แน่ใจว่าไม่มีคุกกี้เซสชัน php ในโดเมนย่อยต่างๆ (เช่นหนึ่งสำหรับ " www.website.com " และอีกรายการหนึ่งสำหรับ " website.com ")

สาเหตุนี้เกิดจากจาวาสคริปต์ที่ใช้โดเมนย่อยในการตั้งค่าคุกกี้และเปิดหน้าเว็บใน iframe อย่างไม่ถูกต้อง


0

ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณกำลังโทรsession_start()ก่อนที่จะใช้$_SESSIONตัวแปร

หากคุณปิดใช้งานการรายงานข้อผิดพลาดให้ลองเปิดเครื่องและดูผลลัพธ์

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

สาเหตุส่วนใหญ่ที่ไม่ได้กล่าวถึงในคำตอบของ @dayuloli:

  1. ปัญหาพื้นที่ดิสก์ ตรวจสอบให้แน่ใจว่าเนื้อที่ดิสก์ของคุณไม่เต็มคุณต้องมีพื้นที่ว่างในการจัดเก็บไฟล์เซสชัน

  2. ไดเรกทอรีเซสชันอาจไม่สามารถเขียนได้ คุณสามารถตรวจสอบได้ด้วยis_writable(session_save_path())


0

ฉันประสบปัญหาเดียวกันและฉันก็ค้นหาคำตอบในรหัสของฉัน ในที่สุดฉันก็พบว่าโฮสติ้งของฉันเพิ่งอัปเดตเวอร์ชัน PHP บนเซิร์ฟเวอร์ของฉันและไม่ได้ตั้งค่าsession_save_pathพารามิเตอร์ในphp.iniไฟล์อย่างถูกต้อง

ดังนั้นหากมีคนอ่านสิ่งนี้โปรดตรวจสอบphp.iniconfig ก่อนสิ่งอื่นใด


0

ตรวจสอบsession_write_closeว่าไม่ได้เรียกระหว่างsession_start()และเวลาที่คุณตั้งค่าเซสชัน

session_start();

[...]

session_write_close();

[...]

$_SESSION['name']='Bob'; //<-- won't save

0

ตอนนี้ GDPR เป็นเรื่องหนึ่งคนที่เข้ามาถามคำถามนี้อาจใช้สคริปต์คุกกี้ สคริปต์นั้นทำให้เกิดปัญหาสำหรับฉัน เห็นได้ชัดว่า PHP ใช้คุกกี้ที่เรียกว่าPHPSESSIDเพื่อติดตามเซสชัน หากสคริปต์นั้นลบออกคุณจะสูญเสียข้อมูลของคุณ

ฉันใช้สคริปต์คุกกี้นี้ มีตัวเลือกในการเปิดใช้งานคุกกี้ "สำคัญ" ฉันเพิ่มPHPSESSIDเข้าไปในรายการสคริปต์หยุดลบคุกกี้และทุกอย่างก็เริ่มทำงานอีกครั้ง

คุณอาจจะสามารถเปิดใช้งานการตั้งค่าบาง PHP เพื่อหลีกเลี่ยงการใช้PHPSESSIDแต่ถ้าสคริปต์คุกกี้ของคุณเป็นสาเหตุของปัญหาทำไมไม่แก้ไขที่


0

ฉันแก้ไขปัญหานี้หลังจากผ่านไปหลายวันของการดีบักและทั้งหมดนี้เป็นเพราะ URL ที่ส่งคืนมาจาก PayPal Express Checkout ไม่มี "www" Chrome ยอมรับว่าโดเมนควรได้รับการปฏิบัติเหมือนกัน แต่บางครั้งเบราว์เซอร์อื่นก็ไม่ทำเช่นนั้น เมื่อใช้เซสชัน / คุกกี้และพา ธ สัมบูรณ์อย่าลืม "www"!


0

ฉันแก้ไขโดยให้สิทธิ์การเขียนกลุ่มไปยังเส้นทางที่ PHP เก็บไฟล์เซสชัน คุณสามารถค้นหาเส้นทางเซสชันด้วยฟังก์ชัน session_save_path ()


0

วันนี้ฉันมีปัญหานี้ในโครงการและฉันต้องเปลี่ยนพารามิเตอร์นี้เป็นเท็จ (หรือลบบรรทัดโดยค่าเริ่มต้นจะถูกปิดใช้งาน):

ini_set( 'session.cookie_secure', 1 );

สิ่งนี้เกิดขึ้นเนื่องจากโครงการจริงทำงานผ่าน http ไม่ใช่ https เท่านั้น พบข้อมูลเพิ่มเติมในเอกสารhttp://php.net/manual/en/session.security.ini.php


0
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();

สายเกินไปที่จะตอบกลับ แต่สิ่งนี้ใช้ได้ผลสำหรับฉัน


0

สำหรับฉันนี่เป็นข้อผิดพลาดในการอนุญาตและสิ่งนี้แก้ไขได้:

chown -R nginx: nginx / var / opt / remi / php73 / lib / php / เซสชัน

ฉันได้ทดสอบ PHP สองสามชั่วโมงและการทดสอบครั้งล่าสุดที่ฉันทำคือฉันสร้างสองไฟล์ session1.php และ session2.php

session1.php:

session_start();

$_SESSION["user"] = 123;

header("Location: session2.php");

session2.php:

session_start();

print_r($_SESSION);

และกำลังพิมพ์อาร์เรย์ว่าง

ณ จุดนี้ฉันคิดว่ามันอาจเป็นปัญหาของเซิร์ฟเวอร์และอันที่จริงมันก็เป็นเช่นนั้น

หวังว่านี่จะช่วยใครบางคนได้


1
chown เป็นโซลูชัน BAD เนื่องจากจะถูกเปลี่ยนกลับเป็นค่าเริ่มต้นในการอัปเดตแพ็คเกจ ดูความคิดเห็นในการกำหนดค่าพูลเริ่มต้น (www.conf) วิธีที่เหมาะสมหากใช้ไดเร็กทอรีอื่นที่ไม่ใช่ apache one (เช่น / var / lib / php / nginx / session)
Remi Collet

คุณพูดถูก การอัปเดตแพ็คเกจเป็นสาเหตุของปัญหาของฉันในตอนแรก แต่เนื่องจากเป็นวิธีที่เสร็จสิ้นและฉันต้องการวิธีแก้ปัญหาที่รวดเร็วซึ่งช่วยได้ ผู้ดูแลระบบ SYS ของฉันแก้ไขได้ฉันไม่ค่อยดีกับ Linux
temo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.