리디렉션 후 PHP 세션이 손실 됨


132

PHP에서 리디렉션 후 세션이 손실되는 문제를 어떻게 해결합니까?

최근에 리디렉션 후 세션이 손실되는 매우 일반적인 문제가 발생했습니다. 그리고이 웹 사이트를 검색 한 후에도 여전히 해결책을 찾을 수 없습니다 (그러나 이것이 가장 가깝습니다).

최신 정보

답변을 찾았으며 동일한 문제가 발생하는 모든 사람을 돕기 위해 여기에 게시한다고 생각했습니다.


1
문제는 PHP에서 리디렉션 후 세션이 손실되는 문제를 해결하는 방법입니다. 나는 이미 다른 사람들에게 알리기 위해 여기에 게시하여 답을 알아 냈습니다. 내 솔루션이 StackOverflow에 없기 때문입니다.
dayuloli 2016 년

2
괜찮지 만 품질 보증 사이트입니다. 질문을 질문하십시오.
jeremy

나는 그것이 당신에게서 온 것을 알지 못했습니다. 그러나이 사이트는 이미 알고있는 질문에 대한 답변이 아니라 질문에 대한 것입니다.
Aris


21
@Aris 사람들이 코딩에 대해 질문을 할 때 StackOverflow에 도움을 요청하는 것은 사실이 아닙니다. 답변이 없으면 필요한 도움을받을 수 없습니다. 그 대답을 제공하려고합니다.
dayuloli 2016 년

답변:


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슈퍼 글로벌 배열 의 키를 덮어 쓰지 않도록 하십시오
  7. 동일한 도메인으로 리디렉션해야합니다. 그래서에서 리디렉션 www.yourdomain.comyourdomain.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, 모든 것이 실패하면 쿠키를 사용하십시오 (임의로 문자열을 생성하여 db에 저장하고 쿠키 값으로 사용하십시오).
Dave Chen

2
HTTP ANDN HTTPS를 전환하는 일 또한 문제가 될 수 stackoverflow.com/questions/441496/...
dev.e.loper

4
참고 5.4.0 register_globals의 제거 된 PHP의로, 그래서는 더 이상 문제 원인
anthonygore

2
웹 서버 오류 로그도 확인하십시오. 제 경우에는 "세션 데이터 (파일)를 쓰지 못했습니다. session.save_path의 현재 설정이 올바른지 확인하십시오"라는 오류가 발생했습니다. save_path 디렉토리에 대한 권한이 잘못되었습니다.
timbonicus

내 세션이 session.save_path가 아닌 다른 곳에 저장되는 이유는 무엇입니까?
Justin

26

헤더 호출 후 "종료"를 사용해야합니다

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

Gecko에는 버그가 있습니다 (예 : Waterfox, Firefox, SeaMonkey). echo ' ';어떤 종류의 데이터 출력 (예 :) 이나 공백이 있으면 위치 헤더를 완전히 무시합니다.
요한 복음

18

가능한 모든 해결책을 시도했지만 아무도 나를 위해 일하지 않았습니다! 물론 공유 호스팅 서비스를 사용하고 있습니다.

결국, 리디렉션 헤더 내부에서 '상대 URL'을 사용하여 문제를 해결했습니다!

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

세션 쿠키를 무효화

header("location: index.php")

매력처럼 일했다!


7

나는 같은 문제가 있었다. 나는 몇 시간 동안 일했고 나를 미치게했다.

제 경우에는 Chrome 및 Firefox에서만 favicon.ico가 없어서 404가 호출 되었습니다 . 다른 항해자는 잘 작동했습니다.


이 답변에 감사드립니다. 이미지에 대한 404 요청이 쿠키없이 Varnish에 의해 PHP로 전달되어 새로운 세션이 지속적으로 생성되고 있음을 깨달았습니다. 당신 없이는 알아낼 수 없었을 것입니다.
파스칼 자작

나는 같은 문제가 있었는데, favicon.ico가 리디렉션되고 (302 하위 도메인에서 기본 도메인으로 리디렉션) 매번 새로운 세션을 생성했습니다. 고마워요!
simdrouin 2018 년

4

내가 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")

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

내 상황이 약간 다르지만 비슷한 문제가있었습니다. 호스트 이름이 windowsIP 주소 인 컴퓨터에 로컬 개발 설정 이있었습니다 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에서) 헤더 위치에 WWW가 없어야한다는 것으로 판명되었습니다 (예 : https : // mysite) . https : //www.mysite 괜찮습니다 . 해당 페이지 세션 변수가 손실됩니다. 모두가 아니라 그 페이지 만.


의는 그 때문에 www.mysite.com완전히 다른 것보다 도메인으로 볼 blog.mysite.com하거나mysite.com
dayuloli

2

나는 모든 솔루션을 확인 / 시도하면서 며칠 동안이 문제로 어려움을 겪었지만 session_start();리디렉션 후 다시 전화하지 않는 것이 문제였습니다 . 방금 세션이 '여전히 살아있다'고 가정했습니다.

잊지 마세요!


예! 이것은 또한 내 문제였다. PHP 세션을 시작하는 것은 온 집안의 조명을 켜는 것과 같다고 생각했습니다. 나는 당신이 들어가는 각 방마다 스위치를 돌려야한다는 것을 몰랐습니다.
데일 톰슨

1

나는 같은 문제가 있었고 가장 쉬운 방법을 찾았습니다. JS 한 줄로 redirect.html로 리디렉션했습니다.

<!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. 그렇다면 https를 사용하여 URL에 액세스해야합니다.

$secure매개 변수가 true이면 세션이 보안 요청 내에서만 사용 가능함을 의미합니다. 무대 나 프로덕션 환경보다 로컬에 더 많은 영향을 줄 수 있습니다.

오늘이 문제를 찾기 위해 대부분의 시간을 보냈기 때문에 그것을 언급했으며 이것이 나를 위해 해결했습니다. 방금이 프로젝트에 추가되었으며 아무도 https가 필요하다고 언급하지 않았습니다.

따라서 https를 로컬로 사용하거나 $secureparam을 설정 FALSE한 다음 http를 로컬로 사용할 수 있습니다. 변경 사항을 푸시 할 때 다시 true로 설정하십시오.

로컬 서버에 따라 로컬 URL이 https로 제공되도록 서버 DocumentRoot에서 편집해야 할 수도 있습니다 httpd-ssl.conf.


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 디렉토리에 쓸 수 없다는 것이 문제였습니다. 너무...


이 대답은 나를 위해 일했습니다. nginx로 Amazon 머신 이미지를 실행합니다. 세션 폴더가 올바른 사용자 (이 경우 www)의 소유가 아니라는 chown -R www.www문제가있어 세션 폴더에서 수행 하면 문제가 해결됩니다.
Joshua

0

나를 위해 Firefox는 쿠키에 세션 ID (PHPSESSID)를 저장했지만 Chrome은 GET 또는 POST 매개 변수를 사용했습니다. 따라서 반환 스크립트 (paypal checkout)가 url 또는 POST 매개 변수로 PHPSESSID를 커밋해야합니다.


0

여기 SO와 다른 블로그에서 많은 솔루션을 시도한 후 저에게 효과적 인 것은 웹 사이트 루트에 .htaccess를 추가하는 것이 었습니다.

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

0

Wordpress를 사용하는 경우이 후크를 추가하고 init에서 세션을 시작해야했습니다.

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

0

아무것도 효과가 없었지만 문제의 원인을 찾아서 해결했습니다.

브라우저 쿠키를 확인하고 다른 하위 도메인 (예 : " www.website.com "및 " website.com ") 에 PHP 세션 쿠키 가 없는지 확인하십시오 .

하위 도메인을 잘못 사용하여 쿠키를 설정하고 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.ini다른 것보다 먼저 구성을 확인하십시오 .


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

며칠 동안 디버깅 한 후에이 문제를 해결했으며 PayPal Express Checkout에서 오는 반환 URL에 'www'가 없기 때문에 문제가 해결되었습니다. Chrome은 도메인을 동일하게 취급해야하지만 다른 브라우저는 그렇지 않은 것으로 인식했습니다. 세션 / 쿠키 및 절대 경로를 사용할 때 'www'를 잊지 마십시오!


0

PHP가 세션 파일을 저장하는 경로에 그룹 쓰기 권한을 부여하여 수정했습니다. session_save_path () 함수로 세션 경로를 찾을 수 있습니다.


0

오늘은 프로젝트 에서이 문제가 있었고이 매개 변수를 false로 변경해야했습니다 (또는 기본적으로 줄을 제거하면 비활성화되어 있음).

ini_set( 'session.cookie_secure', 1 );

이것은 실제 프로젝트가 https가 아닌 http를 통해 작동하기 때문에 발생했습니다. 문서 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 / session

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)의 주석을 참조하십시오. 아파치가 아닌 다른 디렉토리를 사용하는 경우 올바른 방법 (예 : / var / lib / php / nginx / session)
Remi Collet

네 말이 맞아 패키지 업데이트는 처음부터 문제의 원인이었습니다. 그러나 그것이 그렇게 된 방식이기 때문에 이것이 도움이 된 빠른 해결책이 필요했습니다. 내 SYS 관리자가 해결했지만 Linux에 거의 익숙하지 않습니다.
temo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.