하위 도메인 간의 PHP 세션
다음을 설정하려고 합니다.
auth.example.com
sub1.example.com
sub2.example.com
가 방문했을 sub1.example.com
★★★★★★★★★★★★★★★★★」sub2.example.com
이 되지 and and and and and and 로 리다이렉트 .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는 하지만 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 php php php php php php 。질문의 예와 같이 모든 것을 올바르게 설정해도 동작하지 않을 수 있습니다.
다음 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
php 경유htaccess(htp.ini는 ini_set)로 지정합니다.
문제는 제가 이 장치를session.cookie_domain
모든 서브도메인(아직까지는 OK)에 대해서뿐만 아니라 메인도메인에도 대응합니다.의 설정session.cookie_domain
명백히 반대입니다.
기본적으로 제게는 작동 방식입니다.
- 설정하다
session.cookie_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
이것을 사용하면, 다음과 같이 동작합니다.
ini_set('session.cookie_domain',
substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
하위 도메인 및 루트 도메인 쿠키 세션 조합 사용
리소스: http://php.net//manual/tr/function.http-set-http-params.http://http://php.net/
작업을 테스트했습니다.
sub.example.com/sessionadd.php?id=123
example.com/sessionview.php // 123
-- 코드
<?php
$currentCookieParams = session_get_cookie_params();
$rootDomain = '.example.com';
session_set_cookie_params(
$currentCookieParams["lifetime"],
$currentCookieParams["path"],
$rootDomain,
$currentCookieParams["secure"],
$currentCookieParams["httponly"]
);
session_name('mysessionname');
session_start();
setcookie($cookieName, $cookieValue, time() + 3600, '/', $rootDomain);
?>
오픈 같은 건 원치 않으실 것 같네요Joel이 제안하는 것처럼 여러 도메인의 세션 데이터에 액세스할 수 있는 ID입니다.
이 문제의 해결책으로 생각할 수 있는 유일한 방법은 세션 데이터를 데이터베이스에 저장하고 해당 데이터베이스에서 꺼내는 것입니다.
저도 비슷한 문제가 있었습니다만, 이 해결방법은 저에게 있어서 좋았습니다.앞으로 다른 사람에게 도움이 될지도 모릅니다.
php.ini 편집
session.session_domain = ".example.com"
마법은 여기에 있다
suhosin.session.cryptdocroot = Off
suhosin.cookie.cryptdocroot = Off
PHP는 수 에서는, 「PHP」의 「PHP」의 「5.6.6」을 만 하면 .session.cookie_domain
의 값php.ini
file은 iPage의 모든 서브도메인이 동일한 세션 변수 세트를 공유할 수 있도록 트릭을 실행했습니다.
테스트할 브라우저에서 도메인과 관련된 기존 쿠키를 모두 삭제하십시오.
session.cookie_domain = '.yourdomainname.example'
오, 그게 무슨 차이가 있는지는 모르겠지만 세션 자동 시작도 사용하고 있어요.
session.auto_start = 1
에 있는 .session_start()
$sess_life_time = 21600; //in seconds
$sess_path = "/";
$sess_domain = ".example.com";
$sess_secure = true; // if you have secured session
$sess_httponly = true; // httponly flag
session_set_cookie_params($sess_life_time, $sess_path, $sess_domain, $sess_secure, $sess_httponly);
위의 답변은 모두 읽었습니다.제 답변은 구글에 접속하는 사람들에게 도움이 된다고 생각합니다.
를 ( 및 을 (도메인 및 서브브라우저의)로 하는 것을 합니다.
.example.com
.PHP가 세션 변수를 복원하는 데 적합한 "대상"을 찾는지 확인하십시오.
- 도메인과 서브도메인이 같은 머신(다른 가상 호스트)을 가리키는 경우
session_save_path
모두 동일(테스트 완료) - 도메인과 하위 도메인이 서로 다른 머신을 가리키는 경우 공통 스토리지(데이터베이스 등)가 세션 데이터를 저장하고 복원하는 데 가장 적합합니다(아직 테스트하지 않았습니다).사용하다
session_set_save_handler
그렇게 할 수 있어요.
- 도메인과 서브도메인이 같은 머신(다른 가상 호스트)을 가리키는 경우
오래된 것은 알지만, 같은 박스에 여러 도메인과 서브 도메인이 있으면 문제 없습니다.
<?php
define('site_domain','example.com');
session_set_save_handler('_open',
'_close',
'_read',
'_write',
'_destroy',
'_clean');
function _open(){
global $_sess_db;
$db_user = 'user';
$db_pass = 'pass';
$db_host = 'localhost';
if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass)){
return mysql_select_db('database', $_sess_db);
}
return false;
}
function _close(){
global $_sess_db;
return mysql_close($_sess_db);
}
function _read($id){
global $_sess_db;
$id = mysql_real_escape_string($id);
$domain = mysql_real_escape_string(site_domain);
$agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));
$sql = "SELECT data
FROM sessions
WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'";
if ($result = mysql_query($sql, $_sess_db)){
if (mysql_num_rows($result)){
$record = mysql_fetch_assoc($result);
return $record['data'];
}
}
return '';
}
function _write($id, $data){
global $_sess_db;
$access = time();
$id = mysql_real_escape_string($id);
$access = mysql_real_escape_string($access);
$data = mysql_real_escape_string($data);
$domain = mysql_real_escape_string(site_domain);
$agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));
$sql = "REPLACE INTO sessions
VALUES ('$id', '$access', '$data', '$domain', '$agent')";
return mysql_query($sql, $_sess_db);
}
function _destroy($id){
global $_sess_db;
$id = mysql_real_escape_string($id);
$domain = mysql_real_escape_string(site_domain);
$agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));
$sql = "DELETE FROM sessions
WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'";
return mysql_query($sql, $_sess_db);
}
function _clean($max){
global $_sess_db;
$old = time() - $max;
$old = mysql_real_escape_string($old);
$domain = mysql_real_escape_string(site_domain);
$agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));
$sql = "DELETE FROM sessions
WHERE access < '$old' AND domain = '$domain' AND agent = '$agent'";
return mysql_query($sql, $_sess_db);
}
?>
사용방법:
session_name("put_a_session_name");
session_start([
"cookie_domain" => ".example.com",
"cookie_path" => "/"
]);
재빠르고 지저분한 해결책은 리다이렉트용으로 다음과 같이 사용하는 것입니다.
header( $url.'?'.session_name().'='.session_id() );
이것은 ...와 같은 것을 추가할 것이다.?PHPSESSID=etnm7kbuf5lg0r6tv7je6ehtn4
이 URL은 PHP에서 사용해야 하는 세션 ID를 알려줍니다.
언급URL : https://stackoverflow.com/questions/1064243/php-sessions-across-sub-domains
'programing' 카테고리의 다른 글
원칙 2를 사용하여 원시 SQL 실행 (0) | 2023.01.29 |
---|---|
MariaDB 컬럼스토어 LAST_INSERT_ID() 대체 (0) | 2023.01.29 |
Python의 eval()은 무엇을 합니까? (0) | 2023.01.29 |
MySQL Like 다중값 (0) | 2023.01.29 |
함수 포인터 정의가 앰퍼샌드 '&' 또는 아스터리스크 '*'의 수에 관계없이 작동하는 이유는 무엇입니까? (0) | 2023.01.29 |