복붙노트

PHP 세션이 하위 도메인으로 이월되도록 허용

PHP

PHP 세션이 하위 도메인으로 이월되도록 허용

모든 사용자 데이터에 대해 php 세션 (쿠키가 아니라 세션 아이디 쿠키 제외)을 사용하고 사용자가 자신의 프로필 user.mydomain.com으로 이동하면 하위 도메인을 제거 할 때까지 즉시 "로그 아웃"됩니다.

* .mydomain.com이있는 한 모든 도메인의 세션을 수락 할 수 있습니까?

해결법

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

    1.

    다음은 4 가지 옵션입니다.

    php.ini 파일에 넣으십시오 :

    session.cookie_domain = ".example.com"
    

    또는 .htaccess에서 :

    php_value session.cookie_domain .example.com
    

    또는 스크립트의 첫 번째 사항은 다음과 같습니다.

    ini_set('session.cookie_domain', '.example.com' );
    

    또는 사이트의 php-fpm 풀 설정에서

    php_value[session.cookie_domain] = .example.com
    
  2. ==============================

    2.

            if(isset($_COOKIE['session_id']))
                session_id($_COOKIE['session_id']);
            Zend_Session::start(); //or session_start();
            if(!isset($_COOKIE['session_id']))
                setcookie('session_id', session_id(), 0, '/', '.yourdomain.com');
    

    보안은 저주 받아야합니다. 나는 당신처럼 불완전하거나 나쁜 대답으로 좌절하는 경우, 이것은 당신의 구원자입니다. 그냥 작동합니다.

  3. ==============================

    3.

    핵심 기능 파일의 맨 위에서 세션 이름을 변경하십시오 처럼

     session_name('mysession');
    

    다음 PHP 페이지에 다음 코드를 사용하십시오

      session_set_cookie_params(0,"/",".example.com",FALSE,FALSE);
      setcookie(session_name(), session_id(),0,"/","example.com");
      session_start();
    

    마지막으로 하위 도메인의 기본 세션 이름을 변경하고 하위 도메인의 핵심 기능 파일에서 기본 쿠키를 제거합니다. 처럼:

     /*default session name*/
     session_name("mysession");
     /*remove the PHPSESSID and default session name from subdomain's cookie*/
     setcookie( "mysession", "",1,"/" );
     setcookie( "PHPSESSID", "",1,"/" );
    

    PHPSESSID로 쿠키 이름을 계속 사용한다면, 모든 기능을 제거하십시오.

     "mysession" string like session_name('mysession'), setcookie( "mysession", "",1,"/" );
    

    브라우저의 기존 쿠키를 확인하고 도메인 및 하위 도메인의 모든 쿠키를 제거한 다음 프로세스를 반복하십시오.

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

    4.

    나는 이것이 꽤 오래되었다는 것을 알고 있습니다. 그러나 @ CTT의 제안을 더 확장하기 위해서는 다음 텍스트로 내 하위 도메인의 php.ini 파일을 추가해야합니다 (PHP 코드를 실행하고 세션이 필요합니다).

    suhosin.session.cryptdocroot=Off
    suhosin.cookie.cryptdocroot=Off
    

    나는 이것이 도움이되기를 바란다.

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

    5.

    나에게 도움이되는 또 다른 옵션은 세션 이름을 강요하는 것입니다.

    session_name("myWebsite");
    session_start(); 
    
  6. ==============================

    6.

    예. ini_set이 작동 중입니다. 브라우저의 모든 캐시와 쿠키를 파괴하여 제대로 작동하는지 확인하십시오.

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

    7.

    방금이 문제가 있었고 두 개의 서로 다른 하위 도메인에 대해 서로 다른 php.ini 파일을 사용하고있었습니다. 이 ini 파일은 다른 session.save_path 변수를 지정합니다. 세션을 공유해야하는 모든 하위 도메인에서 동일한 이유가 필요합니다.

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

    8.

    이 시도:

    session_start(); 
    
    $sessionId =  session_id();
    

    사용자를 기록했다. 사용자가 다른 하위 도메인으로 전환하면이 user.mydomain.com/?id=$sessionId와 같은 URL의 세션 ID를 보냈습니다.

    $sessionId =  $_GET['id'];
    
    session_start($sessionId); 
    

    이제 사용자는 모든 세션 값을 가져 와서 로그인 상태를 유지합니다.

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

    9.

    if(isset($_COOKIE['session_id']))
        session_id($_COOKIE['session_id']);
        Zend_Session::start(); //or session_start();
    
        if(!isset($_COOKIE['session_id']))
            setcookie('session_id', session_id(), 0, '/', '.yourdomain.com');
    

    이것은 좋은 해결책이지만 모든 상황에서 사용할 수는 없습니다. 예를 들어 비 세션 쿠키에 의존 할 수 없을 때 작동하지 않습니다.

    올바르게 사용하면 실제로 작동해야합니다.

    ini_set('session.cookie_domain', '.example.com' );
    

    예를 들어 session_start ()와 session_start ()를 호출하는 모든 파일 앞에 넣어야합니다.

  10. from https://stackoverflow.com/questions/644920/allow-php-sessions-to-carry-over-to-subdomains by cc-by-sa and MIT lisence