PHPでリダイレクト後にセッションが失われる問題を解決するにはどうすればよいですか?
最近、リダイレクト後にセッションが失われるという非常に一般的な問題が発生しました。そして、このWebサイトを検索した後も、解決策は見つかりません(ただし、これが最も近くなりました)。
更新
私は答えを見つけたので、同じ問題を経験している人を助けるためにここに投稿したいと思いました。
PHPでリダイレクト後にセッションが失われる問題を解決するにはどうすればよいですか?
最近、リダイレクト後にセッションが失われるという非常に一般的な問題が発生しました。そして、このWebサイトを検索した後も、解決策は見つかりません(ただし、これが最も近くなりました)。
更新
私は答えを見つけたので、同じ問題を経験している人を助けるためにここに投稿したいと思いました。
回答:
最初に、次の通常のチェックを実行します。
session_start();
セッションが呼び出される前に必ず呼び出されます。したがって、安全な賭けは、<?php
何よりも前に開始宣言の直後に、ページの先頭に置くことです。また、開く前に空白やタブがないことを確認してください<?php
宣言の。header
リダイレクト後、現在のスクリプトを使用して終了しますexit();
(他の人も提案してsession_write_close();
おりsession_regenerate_id(true)
、あなたもそれらを試すことができますが、私は使用しますexit();
)register_globals
あなたが上でこれを確認することができ、オフになっているphp.ini
ファイルも使用しましたphpinfo()
。オフにする方法については、こちらを参照してください。$_SESSION
スーパーグローバル配列のキーがどこにも上書きされていないことを確認してくださいwww.yourdomain.com
からへのリダイレクトyourdomain.com
はセッションを転送しません。.php
(それが起こる!)であることを確認してください現在、これらは最も一般的な間違いですが、それらがうまくいかなかった場合、問題はホスティング会社にある可能性が高いです。すべてが機能するlocalhost
がリモート/テストサーバーでは機能しない場合は、これが原因である可能性が高いです。ホスティングプロバイダーのナレッジベースを確認してください(フォーラムなども試します)。FatCowやiPageなどの企業では、を指定する必要がありますsession_save_path
。このように:
session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();
(「your home directory path」を実際のホームディレクトリパスに置き換えます。これは通常、コントロールパネル(または同等のもの)test.php
内にありますが、ルートディレクトリにファイルを作成して次のように入力することもできます。
<?php echo $_SERVER['SCRIPT_FILENAME']; ?>
「test.php」の前のビットがホームディレクトリのパスです。そしてもちろん、フォルダがルートディレクトリに実際に存在することを確認してください。(一部のプログラムは同期時に空のフォルダをアップロードしません)
あなたはheader-callの後に「exit」を使うべきです
header('Location: http://www.example.com/?blabla=blubb');
exit;
echo ' ';
:)またはあらゆる種類の空白がある場合、場所ヘッダーは完全に無視されます。
同じ問題がありました。私はそれを数時間作業しました、そしてそれは私を夢中にさせました。
私の場合、問題はChromeとFirefoxでのみfavicon.icoがないために呼び出された404 でした。他のナビゲーターはうまくいきました。
相対パス「dir / file.php」をheader()関数で使用すると、うまくいきます。完全な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")
これは長い間私を困らせました(そしてこの投稿は素晴らしい発見でした!)しかし、ページリダイレクト間のセッションを機能させることがまだできない他の人にとっては... php.iniファイルに移動してcookieをオンにする必要がありました:
session.use_cookies = 1
私はセッションがCookieなしで機能すると思っていました...実際、それらはSHOULDであることを知っています...しかし、これは少なくとも全体像で何が起こっているのか理解できるまで、私の問題を修正しました。
状況は少し異なりましたが、同様の問題がありました。ホスト名windows
とIPアドレスがであるマシンでローカル開発セットアップを行いました192.168.56.2
。
次のいずれかを使用してシステムにアクセスできます。
ログイン後、私のPHPコードは以下を使用してリダイレクトします。
header('http://windows/');
システムへのアクセスに使用された以前のドメイン名がでなかったwindows
場合、セッションデータは失われます。私はコードを次のように変更することでこれを解決しました:
header('http://'.$_SERVER['HTTP_HOST'].'/');
ユーザーが入力したローカルドメイン名またはIPアドレスに関係なく機能するようになりました。
これが誰かに役立つことを願っています。
特定のページでこの問題に遭遇しました。リダイレクトの直前に他のページで$ _SESSION値を設定していたところ、すべてが正常に機能していました。しかし、この特定のページは機能していませんでした。
最後に、この特定のページでは、ページの先頭でセッションを破棄していたが、再度開始していないことに気付きました。だから私の破壊関数はから変更されました:
function sessionKill(){
session_destroy();
}
に:
function sessionKill(){
session_destroy();
session_start();
}
そして、すべてがうまくいきました!
私も同じ問題を抱えていました。セッション変数の突然の一部がすべて次のページに保持されません。(php7.1では)ヘッダーの場所にWWWを含めないでください(例:https:// mysite)。大丈夫です、https://www.mysite。そのページのセッション変数は失われます。すべてではなく、そのページだけです。
www.mysite.com
は、とはまったく異なる、blog.mysite.com
または単純にドメインと見なされているためですmysite.com
私は何日もこれに苦労して、すべての解決策をチェック/試行してきましたが、私の問題はsession_start();
、リダイレクト後に再び電話をしなかったことでした。セッションは「まだ生きている」と思いました。
それを忘れないでください!
を使用しsession_set_cookie_params()
ている場合は、4番目のパラメータを$secure
として渡しているかどうかを確認する必要がありますtrue
。もしそうなら、あなたはhttpsを使用してURLにアクセスする必要があります。
$secure
paramが真の手段中のセッションは、セキュアなリクエスト内でのみ使用可能です。これは、ステージ環境や実稼働環境よりもローカルで影響を受ける可能性があります。
今日のほとんどをこの問題を見つけるために費やしたので、それを言及しました、そしてこれが私のためにそれを解決したものです。私はこのプロジェクトに追加されたばかりで、httpsが必要であると誰も述べていません。
したがって、ローカルでhttpsを使用するか、$secure
paramをに設定してFALSE
ローカルでhttpを使用することができます。変更をプッシュする場合は、必ずtrueに戻してください。
ローカルサーバーによっては、サーバーので編集DocumentRoot
しhttpd-ssl.conf
て、ローカルURLがhttpsで提供されるようにする必要があります。
また、リダイレクトが機能しないという同じ問題があり、見つけたすべての解決策を試しました。ヘッダーリダイレクトがフォームで使用されていました。
ヘッダーリダイレクトを別のphpページ 'signin_action.php'に入れ、変数パラメーターをurlパラメーターで渡してから、 'signin_action.php'フォームに再割り当てすることで解決しました。
signin.php
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';
}
?>
それは美しい回避策ではありませんが、うまくいきました。
まず、変数session_start()
を使用$_SESSION
する前に、呼び出していることを確認してください。
エラー報告を無効にしている場合は、有効にして結果を確認してください。
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
@dayuloliの回答に記載されていない最も一般的な理由:
ディスク容量の問題。ディスク領域がいっぱいでないことを確認してください。セッションファイルを保存するための領域が必要です。
セッションディレクトリは書き込みできない可能性があります。あなたはそれをチェックすることができますis_writable(session_save_path())
GDPRが登場した今、この質問にアクセスする人はおそらくcookieスクリプトを使用しています。あのスクリプトが原因で問題が発生しました。どうやら、PHPはと呼ばれるクッキーを使用していますPHPSESSID
セッションを追跡するためにます。そのスクリプトがそれを削除すると、データが失われます。
私はこのcookieスクリプトを使用しました。「必須」Cookieを有効にするオプションがあります。追加したPHPSESSID
リストすると、スクリプトはCookieの削除を停止し、すべてが再び機能し始めました。
使用を避けるためにPHP設定を有効にすることもできPHPSESSID
ますが、Cookieスクリプトが問題の原因である場合は、それを修正してください。
今日、私はプロジェクトにこの問題があり、このパラメーターをfalseに変更する必要がありました(または行を削除しました。デフォルトでは無効になっています)。
ini_set( 'session.cookie_secure', 1 );
これは、実際のプロジェクトがhttpsではなくhttpでのみ機能するために発生しました。詳細については、ドキュメントhttp://php.net/manual/en/session.security.ini.phpをご覧ください。
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の2つのファイルを作成したことです。
session1.php:
session_start();
$_SESSION["user"] = 123;
header("Location: session2.php");
session2.php:
session_start();
print_r($_SESSION);
空の配列を出力していました。
この時点で、私はそれがサーバーの問題である可能性があると思いました、そして実際、それはそうでした。
これが誰かを助けることを願っています。