리디렉션 후 PHP 세션 손실
PHP에서 리다이렉트 후 세션이 손실되는 문제를 해결하려면 어떻게 해야 합니까?
최근 리다이렉트 후 세션이 손실되는 매우 일반적인 문제가 발생했습니다.그리고 이 웹사이트를 검색해도 (가장 가까운 곳에 있었지만) 해결책을 찾을 수 없습니다.
갱신하다
저는 답을 찾았고, 같은 문제를 겪고 있는 사람들을 돕기 위해 여기에 글을 올리려고 합니다.
우선, 다음의 통상적인 체크를 실시합니다.
- 확인하세요
session_start();
세션이 호출되기 전에 호출됩니다. 페이지할 것 .에 붙이면 돼요<?php
을 사용하다, 「」를 열기 스페이스나 것을 .<?php
★★★★★★ 。 -
header
리다이렉트,하려면 , 「하다」를 합니다.exit();
하고 있다.session_write_close();
★★★★★★★★★★★★★★★★★」session_regenerate_id(true)
해 볼 수 는 '어느 정도'를 사용합니다exit();
) - 테스트에 사용하는 브라우저에서 쿠키가 활성화되어 있는지 확인합니다.
- 하다
register_globals
하실 수 .이것을 확인하실 수 있습니다.php.ini
및 ""를 합니다.phpinfo()
. 끄는 방법은 이 항목을 참조하십시오. - 세션을 삭제하거나 비우지 않았는지 확인합니다.
- 가 있는 것을 해 주세요.
$_SESSION
은 anywheelsuperglobal을. - 같은 도메인으로 리다이렉트 해 주세요. ,, 서, 에, 이, 이, 이, 니, ing, ing, ing, so, so, so, so, so
www.yourdomain.com
로로 합니다.yourdomain.com
세션이 진행되지 않습니다. - 파일 확장자가 다음과 같은지 확인합니다.
.php
( 수수))))))))!)
이것들은 가장 흔한 실수입니다만, 만약 그것이 효과가 없다면, 그 문제는 호스팅 회사와 관련이 있을 가능성이 높습니다. 이 동작하는 localhost
리모트 서버 또는 리모트 서버에는 없습니다.이것이 원인일 가능성이 높습니다.따라서 호스팅 프로바이더의 기술 자료를 확인하십시오(또한 해당 포럼을 사용해 보십시오).등의 의 iPage를 지정해야 .session_save_path
★★★★★★★★★★★★★★★★★★.
session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();
("홈 디렉토리 경로"를 실제 홈 디렉토리 경로로 바꿉니다.은 통상 것) 내에 만, 「」( 「」)을 도 있습니다.test.php
루트 디렉토리의 파일을 입력하고 다음을 입력합니다.
<?php echo $_SERVER['SCRIPT_FILENAME']; ?>
테스트 전 비트.php'는 홈 디렉토리 경로입니다.그리고 물론 폴더가 루트 디렉터리 내에 있는지 확인하십시오(일부 프로그램에서는 동기화할 때 빈 폴더를 업로드하지 않습니다).
header-call 뒤에 "syslog"를 사용해야 합니다.
header('Location: http://www.example.com/?blabla=blubb');
exit;
가능한 모든 방법을 시도해 봤지만 효과가 없었어요!물론 공유 호스팅 서비스를 이용하고 있습니다.
결국 리다이렉트 헤더 안에 있는 'relative url'을 사용하여 문제를 해결했습니다!
header("location: http://example.com/index.php")
세션 쿠키를 무효화하다
header("location: index.php")
마법처럼 작동했어!
저도 같은 문제가 있었어요.몇 시간 동안 작업했는데 미치겠더라고요.
제 경우 Chrome과 Firefox에서만 favicon.ico가 누락되어 404가 호출되었습니다.다른 네비게이터들은 잘 작동했다.
나도 같은 문제를 겪고 있었다.갑자기 세션 변수 중 일부가 다음 페이지로 유지되지 않습니다.문제는 (https://mysite와 같이) 헤더 위치에 WWW가 없어야 한다는 것입니다.OK, https://www.mysite.그러면 해당 페이지 세션 변수가 손실됩니다.전부는 아니고, 그 페이지만.
header() 함수에 있는 상대 경로 "dir/file.php"를 사용하면 됩니다.풀 URL을 사용하여 리다이렉트하면 세션이 저장되지 않는 것 같습니다.
//Does retain the session info for some reason
header("Location: dir");
//Does not retain the session for some reason
header("Location: https://mywebz.com/dir")
맥락은 조금 달랐지만 비슷한 문제가 있었습니다.스 호 트 음 명 신 은 컬 발 습 정 was다했 i had니설개로을 develop whose머ment같다 hostname에 a a이과 on machine local setupwindows
IP 주소가 IP μm였습니다.192.168.56.2
.
다음 중 하나를 사용하여 시스템에 액세스할 수 있습니다.
로그인 후 PHP 코드는 다음과 같이 리다이렉트 됩니다.
header('http://windows/');
시스템에 액세스하기 위해 사용되는 이전 도메인 이름이 스 템 세 용 전 메 름 이 if the이 was 인 도 not the 이 domain system사 to access한위액해 usedwindows
, 세션 데이터는 손실될 것입니다.세션 데이터가 손실됩니다.코드를 변경함으로써 이 문제를 해결했습니다.코드를 다음과 같이 변경하여 이 문제를 해결했습니다.
header('http://'.$_SERVER['HTTP_HOST'].'/');
이제 사용자가 입력한 로컬 도메인 이름 또는 IP 주소에 관계없이 작동합니다.
이게 누군가에게 도움이 됐으면 좋겠어요.
나는 이 문제를 한 페이지에서 우연히 만났다.리다이렉트 직전에 다른 페이지에서 $_SESSION 값을 설정했는데 모든 것이 정상적으로 동작하고 있었습니다.하지만 이 페이지는 작동하지 않았습니다.
마침내 나는 이 특정 페이지에서 내가 페이지 시작 부분에서 세션을 파괴하고 있었지만 다시 시작하지 않았다는 것을 깨달았다.그래서 내 파괴 기능이 바뀌었어:
function sessionKill(){
session_destroy();
}
대상:
function sessionKill(){
session_destroy();
session_start();
}
그리고 모든 게 성공했어!
오랫동안 고민하고 있었습니다(그리고 이 투고는 훌륭했습니다).하지만, 아직 페이지 리다이렉트 사이에 작업을 할 수 없는 분들을 위해...php.ini 파일로 이동하여 쿠키를 켜야 했습니다.
session.use_cookies = 1
쿠키 없이도 세션이 가능하다고 생각했는데...사실 그래야 한다는 건 알지만...이것에 의해 적어도 큰 틀에서 무슨 일이 일어나고 있는지 이해할 수 있을 때까지 문제가 해결되었습니다.
나도 같은 문제가 있어서 가장 쉬운 방법을 찾았어.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;
이게 도움이 됐으면 좋겠어요.
러브 그램
나는 요즘에 어려움을 겪었지만, 안 칠 전 제 동 문 확 인 않 모 i 것시', the for days'/ this problem, i기위 was하해 mysession_start();
재연결 후 다시.다시 리다이렉트 후에.나는 방금 세션이 살아있다고 생각했다.나는 그 세션이 아직 살아있다고 생각했다.
그러니 잊지 마세요!
용 사 우 if경 you are using?session_set_cookie_params()
네 번째 매개 변수 4 째 매 the you 는 인 습 할 있 you param수 if다확 are 4니있번 want might fourth to변전지고개하달 passing수를$secure
as ~하듯이true
. 만약 당신이 있다면 HTTPS를 사용하여 URL 액세스해야 합니다.를 、 https 、 URL 、 에에에에에 。
$secure
한 요청 할 수 합니다.param is true는 안전한요청 내에서만 할 수 있습니다.이는 단계 또는 운영 환경보다 로컬에서 더 많은 영향을 미칠 수 있습니다.
오늘 대부분의 시간을 이 문제를 찾기 위해 보냈기 때문에, 이 문제를 해결했습니다.이 프로젝트에 추가된 지 얼마 되지 않았는데 https가 필요하다고 하는 사람은 없었습니다.
로컬로 하거나 "https"를 설정할 수 있습니다.$secure
변수FALSE
【http】【http】【http】【http】'True' 입니다.
서버에 , 편집이 경우가 있습니다.DocumentRoot
httpd-ssl.conf
「URL」https 「Https」를 참조해 주세요.
다른 생각할 수 있는 이유는 다음과 같습니다.
이것이 서버 스토리지 공간입니다.서버의 디스크 영역이 가득 찼습니다.그래서 서버에서 몇 개의 파일과 폴더를 삭제하고 시도했습니다.
성공했어!!!
세션을 AWS Dynamo DB에 저장 중이지만 서버에서 세션을 처리할 수 있는 공간이 필요합니다.왜 그런지 모르겠어!!!
아무것도 효과가 없었지만 문제의 원인을 찾아 해결했습니다.
브라우저 쿠키를 확인하고 서로 다른 하위 도메인(예: "www.website.com" 및 "website.com")에 php 세션 쿠키가 없는지 확인합니다.
이는 서브도메인을 잘못 사용하여 쿠키를 설정하고 iframe에서 페이지를 여는 Javascript가 원인입니다.
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();
답장하기엔 너무 늦었지만 이건 나에게 효과가 있었어.
나에게 이것은 권한 오류였고, 이것으로 해결되었습니다.
chown - R nginx : nginx / var / opt / remi / php73 / lib / php / session
PHP에서 몇 시간 테스트를 했는데 마지막으로 한 테스트는 session1.php와 session2.php 두 개의 파일을 만든 것입니다.
session1.php:
session_start();
$_SESSION["user"] = 123;
header("Location: session2.php");
세션 2php:
session_start();
print_r($_SESSION);
빈 어레이를 인쇄하고 있었습니다.
현시점에서는 서버 문제일 수 있다고 생각했지만 실제로는 문제가 있었습니다.
이게 도움이 됐으면 좋겠네요.
요점
- 반환 페이지에서 세션을 시작하지 마십시오.
- 세션 변수를 사용하지 않고 헤더를 포함하지 마십시오.php 어떤 사용자 세션 변수
- 결제 정보와 상태를 삽입한 후 홈페이지 또는 프로필 페이지로 링크를 이동하기만 하면 됩니다.
세션이 Strict가 아닌지 확인합니다.이 경우 Stripe에서 돌아오면 세션이 재생성됩니다.
사용방법:
ini_set('session.cookie_samesite', 'Lax');
리다이렉트도 동작하지 않는 것과 같은 문제가 있어, 찾을 수 있는 모든 해결책을 시도해 보았습니다.헤더 리다이렉트는 폼으로 사용되고 있었습니다.
헤더 리다이렉트를 다른 php 페이지 'signin_action'에 넣어 해결했습니다.php'를 사용하여 변수 파라미터를 url 파라미터에서 원하는 대로 전달하고 'signin_action'에서 다시 할당합니다.php' 폼.
signin.displays(로그인.displays)
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';
}
?>
그것은 아름다운 해결책은 아니지만 효과가 있었다.
세션에 시리얼 할 수 없는 오브젝트를 저장하려고 했더니 세션 작성 중에 예외가 발생했다는 오류가 발생했습니다.그러나 모든 에러 처리 코드가 이미 동작을 정지했기 때문에 에러는 발생하지 않았습니다.
아파치 오류 로그에서 찾을 수 있었어요
참고로...몇 시간 동안 모든 것을 시도해 본 결과 디스크가 꽉 차서 php 세션을 tmp 디렉토리에 쓸 수 없다는 문제가 있었습니다.그러니 이 문제가 있으면 그것도 체크해 주세요.
파이어폭스는 세션 ID(PHPSESSID)를 쿠키에 저장했지만 Google Chrome은 GET 또는 POST 파라미터를 사용했습니다.따라서 반환 스크립트(저에게는 paypal checkout)가 url 또는 POST 파라미터로 PHPSESSID를 커밋하는지 확인하기만 하면 됩니다.
SO와 다른 블로그에서 많은 솔루션을 시도해 본 결과...웹 사이트 루트에 .htaccess를 추가하는 것이 효과가 있었습니다.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^yoursitename.com$
RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L]
Wordpress를 사용하는 경우 이 훅을 추가하고 초기화 시 세션을 시작해야 했습니다.
function register_my_session() {
if (!session_id()) {
session_start();
}
}
add_action('init', 'register_my_session');
반드시 확인해 .session_start()
하기 $_SESSION
★★★★★★ 。
에러 보고를 무효로 한 경우는, 설정을 실시해 결과를 확인해 주세요.
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
@dayuloli의 답변에서 언급되지 않은 가장 일반적인 이유는 다음과 같습니다.
디스크 용량 문제디스크 공간이 꽉 차지 않았는지 확인하십시오. 세션 파일을 저장할 공간이 필요합니다.
세션 디렉토리에 쓸 수 없습니다.하실 수 .
is_writable(session_save_path())
나도 같은 문제를 겪고 있었고 답을 찾기 위해 코드를 검색하느라 정신이 없었어.이 최근 하고 PHP 버전이 했습니다.session_save_path
의 php.ini
filename을 클릭합니다.
누가 이걸 꼭 .php.ini
설정을 실시합니다.
확인하세요session_write_close
사이에서는 호출되지 않습니다.session_start()
세션을 설정할 때 사용합니다.
session_start();
[...]
session_write_close();
[...]
$_SESSION['name']='Bob'; //<-- won't save
Larabel을 사용 중인데 이 문제가 발생하는 경우 리디렉션하기 전에 세션 데이터를 저장해야 합니다.
session()->save();
// Redirect the user to the authorization URL.
header('Location: ' . $authorizationUrl);
exit;
GPR이 중요해진 이상, 이 질문을 하는 사람들은 아마 쿠키 스크립트를 사용할 것입니다.그 대본 때문에 문제가 생겼어요.는 PHP라는 하고 있는 것 .PHPSESSID
세션을 추적합니다.스크립트에서 삭제하면 데이터가 손실됩니다.
저는 이 쿠키 대본을 썼어요.「필수」쿠키를 유효하게 하는 옵션이 있습니다.나는 덧붙였다.PHPSESSID
목록까지 스크립트는 쿠키 삭제를 중지하고 모든 것이 다시 작동하기 시작했습니다.
의 하게 해, PHP 의 사용을 수.PHPSESSID
단, cookie 스크립트가 문제의 원인일 경우 수정해 주십시오.
디버깅을 여러 번 한 후 이 문제를 해결했습니다.PayPal Express Checkout에서 보낸 반송 URL에 www가 없기 때문입니다.Chrome은 도메인은 동일하게 취급되어야 하지만 다른 브라우저는 그렇지 않을 수 있다는 것을 인식했습니다.세션/쿠키 및 절대 경로를 사용할 때는 'www'를 잊지 마십시오!
언급URL : https://stackoverflow.com/questions/17242346/php-session-lost-after-redirect
'itsource' 카테고리의 다른 글
중복되지 않은 값 삽입 (0) | 2022.11.15 |
---|---|
mariadb sql default unix_mari (0) | 2022.11.15 |
열 값을 기준으로 Panda에서 DataFrame 행 삭제 (0) | 2022.11.15 |
데이터베이스 설계에서 "n:m"과 "1:n"의 의미 (0) | 2022.11.15 |
Number 객체가 속성을 보유하여 숫자를 증가시키면 이 코드에서 어떤 일이 발생합니까? (0) | 2022.11.15 |