복붙노트

리디렉션 후 PHP 세션 손실

PHP

리디렉션 후 PHP 세션 손실

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

최근에 나는 리다이렉트 이후에 세션을 잃는 매우 일반적인 문제에 직면했다. 그리고이 웹 사이트를 통해 검색 한 후에도 해결책이 없습니다.

최신 정보

나는 답을 찾았고 나는 같은 문제를 겪고있는 누군가를 돕기 위해 여기에 게시 할 것이라고 생각했다.

해결법

  1. ==============================

    1.먼저 다음과 같은 일반적인 점검을 수행하십시오.

    먼저 다음과 같은 일반적인 점검을 수행하십시오.

    자, 이것들이 가장 흔한 실수입니다. 그러나 그들이 트릭을하지 않았다면 문제는 호스팅 회사와 관련이 있습니다. 모든 것이 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'앞에있는 비트는 홈 디렉토리 경로입니다. 물론 폴더가 실제로 루트 디렉토리에 존재하는지 확인하십시오. (일부 프로그램은 동기화 할 때 빈 폴더를 업로드하지 않습니다)

  2. ==============================

    2.header-call 다음에 "exit"를 사용해야합니다.

    header-call 다음에 "exit"를 사용해야합니다.

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

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

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

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

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

    세션 쿠키가 무효화되었습니다.

    header("location: index.php")
    

    매력처럼 일 했어!

  4. ==============================

    4.나는 똑같은 문제가 있었다. 나는 몇 시간 동안 그 일을했고 그것은 나를 미치게 만들었다.

    나는 똑같은 문제가 있었다. 나는 몇 시간 동안 그 일을했고 그것은 나를 미치게 만들었다.

    제 경우에는 Chrome과 Firefox에서만 favicon.ico가 누락되어 404 문제가 발생했습니다. 다른 항법사들은 잘 작동했습니다.

  5. ==============================

    5.이것은 오랫동안 저를 곤란하게 만들었습니다. (이 포스트는 찾기에 좋았습니다!)하지만 페이지 리디렉션 사이의 세션을 여전히 얻을 수없는 다른 사람들을 위해 ... 나는 php.ini 파일에 가서 쿠키를 켜야했습니다. :

    이것은 오랫동안 저를 곤란하게 만들었습니다. (이 포스트는 찾기에 좋았습니다!)하지만 페이지 리디렉션 사이의 세션을 여전히 얻을 수없는 다른 사람들을 위해 ... 나는 php.ini 파일에 가서 쿠키를 켜야했습니다. :

    session.use_cookies = 1 
    

    나는 세션이 쿠키없이 작동한다고 생각했다 ... 실제로 나는 그들이해야만한다는 것을 안다. 그러나 이것이 더 큰 그림에서 어떤 일이 벌어지고 있는지를 이해할 수있을 때까지 적어도 나의 문제는 고쳐졌다.

  6. ==============================

    6.하나의 특정 페이지에서이 문제를 접했습니다. 나는 리디렉션하기 전에 다른 페이지에서 $ _SESSION 값을 설정하고 있었고 모든 것이 잘 작동했습니다. 그러나이 특정 페이지는 작동하지 않았습니다.

    하나의 특정 페이지에서이 문제를 접했습니다. 나는 리디렉션하기 전에 다른 페이지에서 $ _SESSION 값을 설정하고 있었고 모든 것이 잘 작동했습니다. 그러나이 특정 페이지는 작동하지 않았습니다.

    마침내 나는이 특정 페이지에서 페이지의 시작 부분에서 세션을 파괴했지만 결코 다시 시작하지 않는다는 것을 깨달았습니다. 그래서 내 파괴 기능이 다음과 같이 변경되었습니다.

    function sessionKill(){
    
        session_destroy();
    
    }
    

    에:

    function sessionKill(){
    
        session_destroy();
        session_start();
    
    }
    

    모든 것이 성공했습니다!

  7. ==============================

    7.내 상황이 약간 다르긴하지만 비슷한 문제가있었습니다. 호스트 이름이 windows이고 IP 주소가 192.168.56.2 인 컴퓨터에서 로컬 개발 설정을했습니다.

    내 상황이 약간 다르긴하지만 비슷한 문제가있었습니다. 호스트 이름이 windows이고 IP 주소가 192.168.56.2 인 컴퓨터에서 로컬 개발 설정을했습니다.

    다음 중 하나를 사용하여 시스템에 액세스 할 수 있습니다.

    로그인 한 후, 내 PHP 코드는 다음을 사용하여 리디렉션됩니다.

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

    시스템에 액세스하는 데 사용 된 이전 도메인 이름이 windows가 아니면 세션 데이터가 손실됩니다. 코드를 변경하여이 문제를 해결했습니다.

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

    사용자가 입력 한 로컬 도메인 이름이나 IP 주소와 상관없이 작동합니다.

    나는 이것이 이것이 누군가에게 유용 할 수 있기를 바란다.

  8. ==============================

    8.나는 같은 문제를 겪고 있었다. 갑자기 내 세션 변수 중 일부가 다음 페이지로 지속되지 않습니다. 문제는 (php7.1에서) 헤더 위치에 WWW가 없어야합니다 (예 : https : // mysite). OK, https : //www.mysite. 해당 페이지 세션 변수를 잃게됩니다. 모두가 아니라, 그 페이지.

    나는 같은 문제를 겪고 있었다. 갑자기 내 세션 변수 중 일부가 다음 페이지로 지속되지 않습니다. 문제는 (php7.1에서) 헤더 위치에 WWW가 없어야합니다 (예 : https : // mysite). OK, https : //www.mysite. 해당 페이지 세션 변수를 잃게됩니다. 모두가 아니라, 그 페이지.

  9. ==============================

    9.나는 똑같은 문제가있어서 가장 쉬운 방법을 찾았다. 간단히 JS의 1 행으로 리디렉션 .html로 리디렉션되었습니다.

    나는 똑같은 문제가있어서 가장 쉬운 방법을 찾았다. 간단히 JS의 1 행으로 리디렉션 .html로 리디렉션되었습니다.

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

    PHP 대신

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

    이게 도움이 되길 바란다.

    애정 그램

  10. ==============================

    10.난 며칠 동안, 모든 솔루션을 시도 / 노력하고 있지만 문제는 내가 session_start () 호출하지 않았다 고투하고있다; 리디렉션 후에 다시. 방금 세션이 '아직 살아있다'고 생각했습니다.

    난 며칠 동안, 모든 솔루션을 시도 / 노력하고 있지만 문제는 내가 session_start () 호출하지 않았다 고투하고있다; 리디렉션 후에 다시. 방금 세션이 '아직 살아있다'고 생각했습니다.

    그러니 잊지 마세요!

  11. ==============================

    11.session_set_cookie_params ()를 사용하는 경우 네 번째 매개 변수 $ secure를 true로 전달하는지 확인해야 할 수 있습니다. 그렇다면 https를 사용하여 URL에 액세스해야합니다.

    session_set_cookie_params ()를 사용하는 경우 네 번째 매개 변수 $ secure를 true로 전달하는지 확인해야 할 수 있습니다. 그렇다면 https를 사용하여 URL에 액세스해야합니다.

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

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

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

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

  12. ==============================

    12.또 다른 가능한 이유는 다음과 같습니다.

    또 다른 가능한 이유는 다음과 같습니다.

    그것이 내 서버 저장 공간입니다. 내 서버 디스크 공간이 가득 차게됩니다. 그래서, 내 서버에서 몇 가지 파일과 폴더를 제거하고 시도했다.

    그것은 일했다!

    내 세션을 AWS Dynamo DB에 저장하고 있지만 서버에서 세션을 처리 할 공간이 여전히 필요합니다. 확실하지 이유!

  13. ==============================

    13.나는 리다이렉트가 작동하지 않는 것과 같은 문제를 가지고 있으며 찾을 수있는 모든 솔루션을 시도했다. 나의 헤더 리다이렉트가 한 형태로 사용되었다.

    나는 리다이렉트가 작동하지 않는 것과 같은 문제를 가지고 있으며 찾을 수있는 모든 솔루션을 시도했다. 나의 헤더 리다이렉트가 한 형태로 사용되었다.

    나는 다른 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';
    }
    
    ?>
    

    아름다운 해결 방법은 아니지만 효과적입니다.

  14. ==============================

    14.나에게있어서 오류는 세션에 직렬화 할 수없는 객체를 저장하려고 시도했기 때문에 세션을 쓰려고하는 동안 예외가 발생했다. 하지만 모든 오류 처리 코드가 이미 어떤 작업을 중단했기 때문에 나는 오류를 본적이 없습니다.

    나에게있어서 오류는 세션에 직렬화 할 수없는 객체를 저장하려고 시도했기 때문에 세션을 쓰려고하는 동안 예외가 발생했다. 하지만 모든 오류 처리 코드가 이미 어떤 작업을 중단했기 때문에 나는 오류를 본적이 없습니다.

    Apache 오류 로그에서 찾을 수 있습니다.

  15. ==============================

    15.그냥 기록을 위해 ... 나는이 문제가 있었고 몇 시간 동안 디스크를 가득 채우고 PHP 세션을 tmp 디렉토리에 쓸 수 없다는 것이 문제였다. 그래서이 문제를 확인했다면 너무...

    그냥 기록을 위해 ... 나는이 문제가 있었고 몇 시간 동안 디스크를 가득 채우고 PHP 세션을 tmp 디렉토리에 쓸 수 없다는 것이 문제였다. 그래서이 문제를 확인했다면 너무...

  16. ==============================

    16.나에게 Firefox는 세션 ID (PHPSESSID)를 쿠키에 저장했지만 Chrome은 GET 또는 POST 매개 변수를 사용했습니다. 따라서 반환 스크립트 (나에게 : paypal checkout)가 URL 또는 POST 매개 변수에서 PHPSESSID를 커밋하기 만하면됩니다.

    나에게 Firefox는 세션 ID (PHPSESSID)를 쿠키에 저장했지만 Chrome은 GET 또는 POST 매개 변수를 사용했습니다. 따라서 반환 스크립트 (나에게 : paypal checkout)가 URL 또는 POST 매개 변수에서 PHPSESSID를 커밋하기 만하면됩니다.

  17. ==============================

    17.SO 및 다른 블로그에서 많은 솔루션을 시도한 후 ... 나를 위해 일한 것은 웹 사이트 루트에 .htaccess를 추가하는 것이 었습니다.

    SO 및 다른 블로그에서 많은 솔루션을 시도한 후 ... 나를 위해 일한 것은 웹 사이트 루트에 .htaccess를 추가하는 것이 었습니다.

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

    18.Wordpress를 사용하고 있다면이 훅을 추가하고 init에서 세션을 시작해야합니다.

    Wordpress를 사용하고 있다면이 훅을 추가하고 init에서 세션을 시작해야합니다.

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

    19.나에게 도움이되는 것은 없지만 문제를 일으킨 원인을 발견하고 해결했습니다.

    나에게 도움이되는 것은 없지만 문제를 일으킨 원인을 발견하고 해결했습니다.

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

    이것은 잘못된 하위 도메인을 사용하여 쿠키를 설정하고 iframe에서 페이지를 여는 javascript로 인해 발생했습니다.

  20. ==============================

    20.먼저 $ _SESSION 변수를 사용하기 전에 session_start ()를 호출해야합니다.

    먼저 $ _SESSION 변수를 사용하기 전에 session_start ()를 호출해야합니다.

    오류보고 기능을 비활성화 한 경우 켜고 다시 시도하십시오.

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

    @ dayuloli의 답변에 언급되지 않은 가장 일반적인 이유는 다음과 같습니다.

  21. ==============================

    21.나는 똑같은 문제를 겪고 있었고 답을 찾기 위해 내 코드를 검색했다. 마지막으로 내 호스팅에서 최근에 내 서버에서 PHP 버전을 업데이트하고 php.ini 파일에 session_save_path 매개 변수를 올바르게 설정하지 않은 것을 발견했습니다.

    나는 똑같은 문제를 겪고 있었고 답을 찾기 위해 내 코드를 검색했다. 마지막으로 내 호스팅에서 최근에 내 서버에서 PHP 버전을 업데이트하고 php.ini 파일에 session_save_path 매개 변수를 올바르게 설정하지 않은 것을 발견했습니다.

    누군가가 이것을 읽었다면 php.ini 설정을 다른 것보다 먼저 확인하십시오.

  22. ==============================

    22.session_write_close가 session_start () 사이에 호출되지 않았는지, 세션을 설정할 때 확인하십시오.

    session_write_close가 session_start () 사이에 호출되지 않았는지, 세션을 설정할 때 확인하십시오.

    session_start();
    
    [...]
    
    session_write_close();
    
    [...]
    
    $_SESSION['name']='Bob'; //<-- won't save
    
  23. ==============================

    23.Laravel을 사용하고 있는데이 문제가 발생하면 리디렉션 전에 세션 데이터를 저장해야합니다.

    Laravel을 사용하고 있는데이 문제가 발생하면 리디렉션 전에 세션 데이터를 저장해야합니다.

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

    24.이제는 GDPR이 중요하므로이 질문에 방문하는 사람들은 쿠키 스크립트를 사용합니다. 음, 그 스크립트는 저를 위해 문제를 일으켰습니다. 분명히 PHP는 PHPSESSID라는 쿠키를 사용하여 세션을 추적합니다. 해당 스크립트가 스크립트를 삭제하면 데이터가 손실됩니다.

    이제는 GDPR이 중요하므로이 질문에 방문하는 사람들은 쿠키 스크립트를 사용합니다. 음, 그 스크립트는 저를 위해 문제를 일으켰습니다. 분명히 PHP는 PHPSESSID라는 쿠키를 사용하여 세션을 추적합니다. 해당 스크립트가 스크립트를 삭제하면 데이터가 손실됩니다.

    나는이 쿠키 스크립트를 사용했다. "필수"쿠키를 사용할 수있는 옵션이 있습니다. 필자는 PHPSESSID를 목록에 추가했으며, 스크립트는 쿠키 삭제를 중단하고 모든 것이 다시 작동하기 시작했습니다.

    PHPSESSID 사용을 피하기 위해 일부 PHP 설정을 활성화 할 수 있지만 쿠키 스크립트가 문제의 원인 인 경우 수정하지 않으십시오.

  25. ==============================

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

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

  26. ==============================

    26.이전 세션을 먼저 삭제하여 새 세션이 제대로 만들어 졌는지 확인하십시오.

    이전 세션을 먼저 삭제하여 새 세션이 제대로 만들어 졌는지 확인하십시오.

        session_start();
        // remove all session variables
        session_unset();
        // destroy the session
        session_destroy();
        session_start();
        $_SESSION['username'] = 'username';
    

    예, session_start ()가 두 번 호출됩니다. 한 번 unset 및 destroy 명령을 호출하고 두 번째로 새로운 세션을 시작합니다.

  27. ==============================

    27.

    session_start();
    error_reporting(E_ALL ^ (E_NOTICE | E_WARNING));
    if(!isset($_SESSION['name_session'])){
        unset($_SESSION['name_session']);
        session_destroy();
        }   
    if(isset($_SESSION['name_session'])){
        $username = $_SESSION['name_session'];
        }
    
  28. from https://stackoverflow.com/questions/17242346/php-session-lost-after-redirect by cc-by-sa and MIT license