PHPでリダイレクト後にセッションを失う問題を解決するにはどうすればいいですか?
最近、リダイレクト後にセッションを失うという非常に一般的な問題に遭遇しました。そして、このウェブサイトを検索した後、私はまだ解決策を見つけることができません(しかし これ が一番近くに来ました)。
更新
私は答えを見つけました、そして私は私が私が同じ問題を経験している人を助けるためにそれをここに投稿することを考えていました。
まず、これらの通常のチェックを行います。
session_start();
が呼び出されることを確認してください。だから安全な賭けはそれをあなたのページの始めに、他の何かの前に開始<?php
宣言の直後に置くことでしょう。また、開始<?php
宣言の前に空白やタブがないことを確認してください。header
のリダイレクト後、exit();
を使用して現在のスクリプトを終了します(他の人もsession_write_close();
およびsession_regenerate_id(true)
を提案していますが、それらを試すこともできますが、私はexit();
を使用します)。register_globals
がオフになっていることを確認します。これはphp.ini
ファイルで、またphpinfo()
を使用して確認できます。無効にする方法については this を参照してください。$_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();
(「ホームディレクトリのパス」を実際のホームディレクトリのパスに置き換えます。これは通常、コントロールパネル(または同等のもの)内にありますが、ルートディレクトリにtest.php
ファイルを作成して次のように入力することもできます。
<?php echo $_SERVER['SCRIPT_FILENAME']; ?>
'test.php'の前のビットはあなたのホームディレクトリのパスです。そしてもちろん、フォルダが実際にあなたのルートディレクトリの中に存在することを確認してください。 (一部のプログラムは同期時に空のフォルダをアップロードしません)
あなたはheader-callの後に "exit"を使うべきです
header('Location: http://www.example.com/?blabla=blubb');
exit;
考えられる解決策をすべて試しましたが、どれもうまくいきませんでした。もちろん、私は共有ホスティングサービスを利用しています。
結局、リダイレクトヘッダ内で 'relative url'を使用することで問題を回避できました。
header("location: http://example.com/index.php")
セッションクッキーを無効にした
header("location: index.php")
魅力のように働いた!
私は同じ問題を抱えていました。私は数時間それに取り組みました、そしてそれは私を狂わせました。
私の場合、問題は404と、ChromeとFirefoxでmissing a favicon.icoが原因で呼び出されたことです。他のナビゲーターはうまくいきました。
私の文脈は少し異なっていたが、私は同様の問題を抱えていた。私は、ホスト名がwindows
、IPアドレスが192.168.56.2
のマシンでローカル開発設定をしました。
私は次のいずれかを使用してシステムにアクセスできました。
ログイン後、私のPHPコードは次のようにリダイレクトします。
header('http://windows/');
システムへのアクセスに使用されていた以前のドメイン名がwindows
ではなかった場合、セッションデータは失われます。私はこれをコードを次のように変更することで解決しました
header('http://'.$_SERVER['HTTP_Host'].'/');
ユーザーがどのローカルドメイン名またはIPアドレスを入力したかにかかわらず動作するようになりました。
私はこれが誰かに役立つかもしれないと思います。
私は同じ問題を抱えていました。私のセッション変数の突然のいくつかが次のページに固執しないでしょう。問題は(php7.1で)あなたのヘッダ位置にはWWWがあってはいけませんでした、例 https:// mysite 。大丈夫です、 https://www.mysite 。そのページのセッション変数を失います。すべてではなく、そのページだけです。
これは長い間私を困惑させました(そしてこの記事は見つけるのは素晴らしいことでした!)それでもまだページリダイレクトの間にセッションを実行することができない他の人のために...私はphp.iniファイルに入ってクッキーをオンにしなければなりませんでした:
session.use_cookies = 1
私はセッションがクッキーなしでうまくいくと思っていました...実際、私はそれらがSHOULDであることを知っています...しかしこれは少なくとも全体像で何が起こっているのか理解できるまで私の問題を解決しました。
私は1つの特定のページでこの問題に遭遇しました。リダイレクトする直前に他のページで$ _SESSION値を設定していましたが、すべてうまくいきました。しかし、この特定のページは機能していませんでした。
最後に、この特定のページでは、ページの始めにセッションを破棄していましたが、再開することはありませんでした。それで私のdestroy関数は次のように変わりました。
function sessionKill(){
session_destroy();
}
に:
function sessionKill(){
session_destroy();
session_start();
}
そしてすべてがうまくいった!
session_set_cookie_params()
を使用している場合は、4番目のパラメータ$secure
をtrue
として渡しているかどうかを確認します。もしそうなら、httpsを使ってURLにアクセスする必要があります。
$secure
パラメータがtrueであるということは、セッションが安全なリクエスト内でのみ利用可能であることを意味します。これは舞台環境や本番環境よりもローカルにあなたに影響を与えるかもしれません。
今日のほとんどの時間をこの問題の発見に費やしたので、それについて言及してください、そしてこれは私にとってそれを解決したものです。私はこのプロジェクトに追加されたばかりで、httpsが必要だとは誰も言わなかった。
そのため、ローカルでhttpsを使用するか、$secure
パラメータをFALSE
に設定してからローカルでhttpを使用することができます。変更をプッシュアップするときは、必ずtrueに戻してください。
ローカルサーバーによっては、ローカルURLがhttpsで配信されるように、サーバーのhttpd-ssl.conf
内のDocumentRoot
を編集する必要があります。
もう一つの考えられる理由:
それが私のサーバーの記憶域です。サーバーのディスク容量がいっぱいになりました。だから、私は私のサーバー内のいくつかのファイルやフォルダを削除してみました。
うまくいった!
セッションをAWS Dynamo DBに保存していますが、セッションを処理するためにサーバー内のスペースが必要です。理由がわからない!
私は何日もの間この問題に取り組み、すべての解決策を調べてみましたが、私の問題はリダイレクト後に再びsession_start();
を呼び出さなかったことです。セッションは「まだ生きている」と思いました。
それを忘れないでください。
私は同じ問題を抱えていて、最も簡単な方法を見つけました。私は単純に1行のJSでリダイレクトの.htmlにリダイレクトしました
<!DOCTYPE html>
<html>
<script type="text/javascript">
<!--
window.location = "admin_index.php";
//–>
</script>
</html>
pHPの代わりに
header_remove();
header('Location: admin_login.php');
die;
これが役に立つことを願っています。
ラブグラム
$_SESSION
変数を使用する前に、まずsession_start()
を呼び出していることを確認してください。
エラー報告を無効にした場合は、有効にして結果を確認してください。
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
@ dayuloliの回答に記載されていない最も一般的な理由:
ディスク容量の問題ディスク容量が一杯になっていないことを確認してください。セッションファイルを保存するためのスペースが必要です。
セッションディレクトリは書き込み可能ではないかもしれません。 is_writable(session_save_path())
で確認できます
私にとって迅速で実用的なソリューションは、単に二重リダイレクトでした。 fb-go.php
とfb-redirect.php
の2つのファイルを作成しました
fb-go.php
は次のようになりました。
session_start();
$_SESSION['FBRLH_state'] = 'some_unique_string_for_each_call';
header('Location: fb-redirect.php');
およびfb-redirect:
session_start();
header('Location: FULL_facebook_url_with_' . $_SESSION['FBRLH_state'] . '_value');
言及する価値があるのは、Android Chromeブラウザーの動作です。ユーザーがそのようなものを見ることができる場所:
ユーザーがFacebookアプリを選択すると、ユーザーセッションデータを保存しているChromeではなくFacebookブラウザーで開くため、セッションが失われます。
私の場合、FirefoxはセッションID(PHPSESSID)をCookieに格納していますが、Google ChromeはGETまたはPOSTパラメータを使用しています。つまり、返されるスクリプト(私の場合はPaypalチェックアウト)がURLのPHPSESSIDまたはPOSTパラメータを必ずコミットするようにする必要があります。
今日、私はプロジェクトでこの問題を抱えていました、そして私はこのパラメータをfalseに変更しなければなりませんでした(またはデフォルトで無効になっている行を削除します):
ini_set( 'session.cookie_secure', 1 );
これは実際のプロジェクトがhttpではなくhttpsのみで動作するために起こりました。ドキュメントでより多くの情報を見つけました http://php.net/manual/en/session.security.ini.php
OPは、同じページにリダイレクトするかどうか(ログイン後など)を指定しませんでした。サーバー/ブラウザのキャッシュも問題になる可能性がある場合
簡単な回避策は、URLの最後にバージョン番号を追加することです(.CSSファイルの更新を強制する場合と同様)。
例:
header('Location: index.php?v='.time());
そのため、ユーザーはリダイレクトされ、新しいページのように扱われます
domain.com/index.php?v=122234982323
SOや他のブログでここで多くの解決策を試した後...私のために働いたのは私のウェブサイトのルートに.htaccessを追加することでした。
RewriteEngine on
RewriteCond %{HTTP_Host} ^yoursitename.com$
RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L]
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();
返信が遅すぎますが、これは私のために働きました
何も私にはうまくいきませんでしたが、私は問題を引き起こしたもの(そしてそれを解決したもの)を見つけました:
ブラウザのクッキーをチェックし、異なるサブドメインのphpセッションクッキー( "www.website.com"用、 "用)などがないことを確認してください( website.com ")。
これは、Cookieを設定し、iframeでページを開くためにサブドメインを誤って使用していたJavaScriptが原因でした。
私にはこれはパーミッションエラーであり、これはそれを解決しました:
chown -R nginx:nginx/var/opt/remi/php73/lib/php/session
私はPHPで数時間テストしました、そして私がした最後のテストは私が2つのファイルsession1.phpとsession2.phpを作成することでした。
session1.php:
session_start();
$_SESSION["user"] = 123;
header("Location: session2.php");
session2.php:
session_start();
print_r($_SESSION);
そしてそれは空の配列を出力していました。
現時点で、私はそれがサーバーの問題である可能性があると思いました、そして実際に、それはそうでした。
これが誰かに役立つことを願っています。
session_start()
とセッションの設定時の間にsession_write_close
が呼び出されないようにしてください。
session_start();
[...]
session_write_close();
[...]
$_SESSION['name']='Bob'; //<-- won't save
PHPがセッションファイルを保存するパスへのグループ書き込み権限を与えることで修正しました。 session_save_path()関数でセッションパスを見つけることができます。
私にとってのエラーは、セッションを書き込もうとしている間に例外が投げられるように、セッション内でシリアル化できないオブジェクトを保存しようとしたことです。しかし、私のエラー処理コードはすべて操作を中止しているので、私はエラーを見たことがありません。
しかし、私はそれをApacheのエラーログで見つけることができました。
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")
私は何日ものデバッグの後にこの問題を修正しました、そしてそれはすべてPaypal Express Checkoutから来る私のリターンURLが 'www'を持っていなかったことのすべてでした。 Chromeはドメインは同じように扱われるべきだが他のブラウザは時々そうではないことを認識していました。セッション/クッキーと絶対パスを使うときは、「www」を忘れないでください。
GDPRが問題になった今、この質問に訪れる人々はおそらくクッキースクリプトを使うでしょう。ええと、そのスクリプトは私のために問題を引き起こしました。どうやらPHPはセッションを追跡するためにPHPSESSID
と呼ばれるクッキーを使います。そのスクリプトがそれを削除すると、あなたはデータを失います。
私は このクッキースクリプト を使用しました。 「必須」Cookieを有効にするオプションがあります。私はリストにPHPSESSID
を追加しました、スクリプトはクッキーを削除するのを止めました、そして、すべては再び働き始めました。
おそらくPHP設定を有効にしてPHPSESSID
を使用しないようにすることもできますが、Cookieスクリプトが問題の原因である場合は、を修正しないでください.
Laravelを使用していてこの問題が発生した場合は、リダイレクトする前にセッションデータを保存する必要があります。
session()->save();
// Redirect the user to the authorization URL.
header('Location: ' . $authorizationUrl);
exit;
私もリダイレクトが機能していないと同じ問題を抱えていたし、私が見つけることができるすべての解決策を試してみました、私のヘッダーのリダイレクトがフォームで使用されていました。
私はそれを別の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';
}
?>
これは美しい回避策ではありませんが、うまくいきました。
ただ記録のために...私はこの問題を抱えていました、そしてすべての問題を試みた数時間後の問題はディスクがいっぱいで、phpセッションがtmpディレクトリに書き込めなかったということでした。も….
私は同じ問題を抱えていたので、私は自分のコードで答えを探していました。最後に、私のホスティングが最近私のサーバー上のPHPバージョンを更新し、session_save_path
ファイルのphp.ini
パラメータを正しく設定していないことがわかりました。
ですから、誰かがこれを読んだ場合は、何よりもphp.ini
configをチェックしてください。
あなたがWordpressを使っているなら、私はこのフックを追加してinitでセッションを開始しなければなりませんでした:
function register_my_session() {
if (!session_id()) {
session_start();
}
}
add_action('init', 'register_my_session');