[php] 하위 도메인 간 PHP 세션

다음을 설정하려고합니다.

auth.example.com
sub1.example.com
sub2.example.com

사용자가 sub1.example.com또는을 방문 sub2.example.com했지만 로그인하지 않은 경우로 리디렉션되어 auth.example.com로그인 할 수 있습니다.

sub1.example.com그리고 sub2.example.com두 개의 별도의 응용 프로그램입니다하지만 같은 자격 증명을 사용합니다.

내 php.ini에서 다음 설정을 시도했습니다.

session.cookie_domain = ".example.com"

그러나 한 도메인에서 다른 도메인으로 정보를 전달하지 않는 것 같습니다.

[편집하다]

다음을 시도했습니다.

sub1.example.com/test.php

session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Regsitered'] = 1;
echo '<a href="http://auth.example.com/test.php">Change Sites</a>'

auth.example.com/test.php

session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Checked'] = 1;
print_r($_SESSION);

세션 ID는 정확히 동일하지만 $_SESSION변수를 덤프하면 두 키가 모두 표시되지 않으며 각 도메인 아래에 설정 한 키만 표시됩니다.



답변

문제가 여전히 존재하는지 모르겠지만 동일한 문제가 발생하여 호출하기 전에 세션 이름을 설정하여 해결했습니다 session_set_cookie_params().

$some_name = session_name("some_name");
session_set_cookie_params(0, '/', '.example.com');
session_start();

나는 내에서 아무것도 변경하지 php.ini않았지만 이제 모든 것이 잘 작동합니다.


답변

쿠키가 올바르게 설정 되었음에도 불구하고 세션 데이터가 하위 도메인에서 읽히는 것을 신비롭게 방지 할 수있는 한 가지 .example.com PHP Suhosin 패치입니다. 질문의 예에 따라 모든 것을 올바르게 구성 할 수 있으며 작동하지 않을 수 있습니다.

다음 Suhosin 세션 설정을 끄면 다시 업무를 시작할 수 있습니다.

suhosin.session.cryptua = Off
suhosin.session.cryptdocroot = Off


답변

다음을 사용해보십시오.

session.cookie_domain = "example.com"

대신에:

session.cookie_domain = ".example.com"

처음에 누락 된 기간을 기록하십시오.

하지만 모든 브라우저에서 지원되는 것은 아니기 때문에 사용에주의하십시오.


답변

이 정확한 문제가있었습니다-x.example.local에서 생성 된 세션 값을 example.local에서 사용할 수 있고 그 반대의 경우도 가능하기를 원했습니다.

내가 찾은 모든 솔루션은 사용하여 세션 도메인을 변경한다고 말했습니다.
php_value session.cookie_domain .example.local 은 .htaccess (또는 php.ini 또는 ini_set를 통해)를 .

문제는 session.cookie_domain모든 하위 도메인 (지금까지는 괜찮음)뿐 아니라 기본 도메인에 대해을 설정하고 있다는 것 입니다. session.cookie_domain메인 도메인에를 설정하는 것은 명백히 아니오입니다.

기본적으로 그것이 나를 위해 일한 방식 :

  • session.cookie_domain모든 하위 도메인에 대해 설정하십시오 .
  • 기본 DOMAIN에 대해 설정하지 마십시오.

예, 도메인에 TLD (제 경우에는 .local)가 있는지 확인하십시오. Http 프로토콜은 쿠키 / 세션이 .tld없이 도메인에 저장되는 것을 허용하지 않습니다 (즉, localhost는 작동하지 않지만 stuff.localhost는 작동합니다).

편집 : 또한 하위 도메인에서 세션을 테스트 / 디버깅하는 동안 항상 브라우저 쿠키를 지우십시오. 그렇지 않은 경우 브라우저는 항상 올바른 cookie_domain이 아직 설정되지 않은 이전 세션 쿠키를 보냅니다. 서버는 이전 세션을 되살 리므로 잘못된 결과를 얻게됩니다. (많은 게시물에서 똑같은 효과를 위해 session_name ( ‘stuff’)를 사용한다고 언급되었습니다)


답변

이렇게 해결 했어

ini_set('session.cookie_domain', '.testdomain.example');
session_start();

내가 localhost에서 일하고 있었기 때문에

ini_set('session.cookie_domain', '.localhost');

작동하지 않았 으며 .com / .local / … 대신 .localhost를 최상위로 봅니다. (나는 의심합니다)


답변

확인했습니다. 조레온 의 대답이 맞습니다. 평판이 충분하지 않아 댓글을 달 수 없어 여기에 댓글을 올립니다.

구성 파일에서 상수를 정의하십시오. 변경하려는 경우 전체 파일을 수정할 필요가 없습니다.

define('ROOT_DOMAIN',   'mysite.example');
define('PHP_SESSION_NAME', 'MYSITE');

세션 이름은 숫자로만 구성 될 수 없으며 적어도 하나의 문자가 있어야합니다. 그렇지 않으면 매번 새 세션 ID가 생성됩니다.

다음 코드를 사용하여 세션 사용을 시작하십시오.

session_name(PHP_SESSION_NAME);
session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
session_start();

이 기능을 사용하고 있습니다.

function load_session() {
    if (session_status() == PHP_SESSION_NONE) {
        session_name(PHP_SESSION_NAME);
        session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
        session_start();
    } elseif (session_name() != PHP_SESSION_NAME) {
        session_destroy();
        session_name(PHP_SESSION_NAME);
        session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
        session_start();
    }
}
load_session(); // put it in anywhere you want to use session


답변

모든 도메인 / 하위 도메인에서 사용 :

session_name('name');
ini_set('session.cookie_domain', '.example.com');
ini_set('session.save_path', '/var/lib/php/session');
session_start();

의 경로 session.save_path는 경우에 따라 다를 수 있지만 모든 도메인 / 하위 도메인 에서 동일 해야합니다 . 기본적으로 항상 참은 아닙니다.