PHP에서 리디렉션 후 세션이 손실되는 문제를 어떻게 해결합니까?
최근에 리디렉션 후 세션이 손실되는 매우 일반적인 문제가 발생했습니다. 그리고이 웹 사이트를 검색 한 후에도 여전히 해결책을 찾을 수 없습니다 (그러나 이것이 가장 가깝습니다).
최신 정보
답변을 찾았으며 동일한 문제가 발생하는 모든 사람을 돕기 위해 여기에 게시한다고 생각했습니다.
PHP에서 리디렉션 후 세션이 손실되는 문제를 어떻게 해결합니까?
최근에 리디렉션 후 세션이 손실되는 매우 일반적인 문제가 발생했습니다. 그리고이 웹 사이트를 검색 한 후에도 여전히 해결책을 찾을 수 없습니다 (그러나 이것이 가장 가깝습니다).
최신 정보
답변을 찾았으며 동일한 문제가 발생하는 모든 사람을 돕기 위해 여기에 게시한다고 생각했습니다.
답변:
먼저 다음과 같은 일반적인 점검을 수행하십시오.
session_start();
세션이 호출되기 전에 호출 되는지 확인하십시오 . 따라서 안전한 시작은 페이지의 시작 부분에서 시작 <?php
선언 직후에 다른 것보다 우선하는 것입니다. 또한 오프닝 <?php
선언 전에 공백 / 탭이 없는지 확인하십시오 .header
리디렉션 후 다음을 사용하여 현재 스크립트를 종료하십시오 exit();
(다른 사람들도 제안 session_write_close();
했으며 session_regenerate_id(true)
, 시도해 볼 수도 있지만 사용할 것입니다 exit();
)register_globals
이 꺼져 있는지 확인 하고 php.ini
파일을 사용하여 확인할 수도 있습니다 phpinfo()
. 전원을 끄는 방법에 대해서는 이 내용 을 참조하십시오 .$_SESSION
슈퍼 글로벌 배열 의 키를 덮어 쓰지 않도록 하십시오www.yourdomain.com
을 yourdomain.com
앞으로 세션을 수행하지 않습니다..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'앞의 비트는 홈 디렉토리 경로입니다. 물론 폴더가 실제로 루트 디렉토리 내에 있는지 확인하십시오. (일부 프로그램은 동기화시 빈 폴더를 업로드하지 않습니다)
헤더 호출 후 "종료"를 사용해야합니다
header('Location: http://www.example.com/?blabla=blubb');
exit;
echo ' ';
어떤 종류의 데이터 출력 (예 :) 이나 공백이 있으면 위치 헤더를 완전히 무시합니다.
가능한 모든 해결책을 시도했지만 아무도 나를 위해 일하지 않았습니다! 물론 공유 호스팅 서비스를 사용하고 있습니다.
결국, 리디렉션 헤더 내부에서 '상대 URL'을 사용하여 문제를 해결했습니다!
header("location: http://example.com/index.php")
세션 쿠키를 무효화
header("location: index.php")
매력처럼 일했다!
나는 같은 문제가 있었다. 나는 몇 시간 동안 일했고 나를 미치게했다.
제 경우에는 Chrome 및 Firefox에서만 favicon.ico가 없어서 404가 호출 되었습니다 . 다른 항해자는 잘 작동했습니다.
내가 header () 함수에서 상대 경로 "dir / file.php"를 사용하면 나를 위해 작동합니다. 전체 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")
이것은 오랫동안 저를 비웃었습니다 (그리고이 게시물은 찾기 좋았습니다!). 그러나 페이지 리디렉션 사이에서 세션을 얻을 수없는 다른 사람들을 위해 ... php.ini 파일로 가서 쿠키를 켜야했습니다. :
session.use_cookies = 1
나는 세션이 쿠키없이 작동한다고 생각했습니다 ... 사실 나는 그들이해야한다는 것을 알고 있습니다 ... 그러나 이것은 더 큰 그림에서 무슨 일이 일어나고 있는지 이해할 수있을 때까지 내 문제를 해결했습니다.
내 상황이 약간 다르지만 비슷한 문제가있었습니다. 호스트 이름이 windows
IP 주소 인 컴퓨터에 로컬 개발 설정 이있었습니다 192.168.56.2
.
다음 중 하나를 사용하여 시스템에 액세스 할 수 있습니다.
로그인 후 PHP 코드는 다음을 사용하여 리디렉션됩니다.
header('http://windows/');
시스템에 액세스하는 데 사용 된 이전 도메인 이름이 아닌 windows
경우 세션 데이터가 손실됩니다. 코드를 다음과 같이 변경하여이 문제를 해결했습니다.
header('http://'.$_SERVER['HTTP_HOST'].'/');
사용자가 입력 한 로컬 도메인 이름 또는 IP 주소에 관계없이 작동합니다.
나는 이것이 누군가에게 도움이되기를 바랍니다.
하나의 특정 페이지 에서이 문제가 발생했습니다. 리디렉션하기 바로 전에 다른 페이지에서 $ _SESSION 값을 설정하고 모든 것이 제대로 작동했습니다. 그러나이 특정 페이지는 작동하지 않았습니다.
마지막 으로이 특정 페이지에서 페이지 시작 부분에서 세션을 파괴하지만 다시 시작하지 않는다는 것을 깨달았습니다. 그래서 내 파괴 기능이 다음과 같이 변경되었습니다.
function sessionKill(){
session_destroy();
}
에:
function sessionKill(){
session_destroy();
session_start();
}
그리고 모든 것이 효과가있었습니다!
나는 같은 문제를 겪고 있었다. 갑자기 세션 변수 중 일부가 다음 페이지에 유지되지 않습니다. 문제는 (php7.1에서) 헤더 위치에 WWW가 없어야한다는 것으로 판명되었습니다 (예 : https : // mysite) . https : //www.mysite 괜찮습니다 . 해당 페이지 세션 변수가 손실됩니다. 모두가 아니라 그 페이지 만.
www.mysite.com
완전히 다른 것보다 도메인으로 볼 blog.mysite.com
하거나mysite.com
사용중인 경우 session_set_cookie_params()
네 번째 매개 변수를 $secure
로 전달하는지 확인하고 싶을 수 있습니다 true
. 그렇다면 https를 사용하여 URL에 액세스해야합니다.
이 $secure
매개 변수가 true이면 세션이 보안 요청 내에서만 사용 가능함을 의미합니다. 무대 나 프로덕션 환경보다 로컬에 더 많은 영향을 줄 수 있습니다.
오늘이 문제를 찾기 위해 대부분의 시간을 보냈기 때문에 그것을 언급했으며 이것이 나를 위해 해결했습니다. 방금이 프로젝트에 추가되었으며 아무도 https가 필요하다고 언급하지 않았습니다.
따라서 https를 로컬로 사용하거나 $secure
param을 설정 FALSE
한 다음 http를 로컬로 사용할 수 있습니다. 변경 사항을 푸시 할 때 다시 true로 설정하십시오.
로컬 서버에 따라 로컬 URL이 https로 제공되도록 서버 DocumentRoot
에서 편집해야 할 수도 있습니다 httpd-ssl.conf
.
또한 리디렉션이 작동하지 않는 것과 동일한 문제가 발생하여 찾을 수있는 모든 솔루션을 시도했지만 헤더 리디렉션이 양식으로 사용되었습니다.
헤더 리디렉션을 다른 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';
}
?>
그것은 아름다운 해결 방법은 아니지만 효과가있었습니다.
우선, 변수 session_start()
를 사용하기 전에 호출하고 있는지 확인하십시오 $_SESSION
.
오류보고를 비활성화 한 경우 켜고 결과를 확인하십시오.
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
@dayuloli의 답변에 언급되지 않은 가장 일반적인 이유 :
디스크 공간 문제 디스크 공간이 가득 차지 않았는지 확인하십시오. 세션 파일을 저장할 공간이 필요합니다.
세션 디렉토리가 쓰기 가능하지 않을 수 있습니다. 당신은 그것을 확인할 수 있습니다is_writable(session_save_path())
GDPR이 문제이므로이 질문을 방문하는 사람들은 아마도 쿠키 스크립트를 사용합니다. 글쎄, 그 스크립트는 나에게 문제를 일으켰다. 분명히 PHP는 쿠키 PHPSESSID
를 사용하여 세션을 추적합니다. 해당 스크립트가 삭제하면 데이터가 손실됩니다.
이 쿠키 스크립트를 사용 했습니다 . "필수"쿠키를 활성화하는 옵션이 있습니다. PHPSESSID
목록에 추가 하면 스크립트가 쿠키 삭제를 중지하고 모든 것이 다시 작동하기 시작했습니다.
당신은 아마 사용하지 않는 일부 PHP 설정을 사용할 수 PHPSESSID
있지만, 쿠키 스크립트가 문제의 원인인지, 왜 해결되지 것을 .
오늘은 프로젝트 에서이 문제가 있었고이 매개 변수를 false로 변경해야했습니다 (또는 기본적으로 줄을 제거하면 비활성화되어 있음).
ini_set( 'session.cookie_secure', 1 );
이것은 실제 프로젝트가 https가 아닌 http를 통해 작동하기 때문에 발생했습니다. 문서 http://php.net/manual/en/session.security.ini.php 에서 더 많은 정보를 찾았습니다 .
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();
답변하기에 너무 늦었지만 이것은 나를 위해 일했습니다.
나에게 이것은 권한 오류이며 이것이 해결되었습니다.
chown -R nginx : nginx / var / opt / remi / php73 / lib / php / session
PHP에서 몇 시간을 테스트했으며 마지막 테스트는 session1.php와 session2.php라는 두 파일을 만드는 것입니다.
session1.php :
session_start();
$_SESSION["user"] = 123;
header("Location: session2.php");
session2.php :
session_start();
print_r($_SESSION);
빈 배열을 인쇄하고있었습니다.
이 시점에서 서버 문제 일 수 있다고 생각했지만 실제로는 문제였습니다.
이것이 누군가를 돕기를 바랍니다.