[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
는 경우에 따라 다를 수 있지만 모든 도메인 / 하위 도메인 에서 동일 해야합니다 . 기본적으로 항상 참은 아닙니다.