thinkphp フレームワークを使用して Web アプリケーションを開発する過程で、ジャンプが繰り返されるなど、ジャンプの問題が発生することがあります。この状況は通常、コントローラでリダイレクト機能を使用しているときに発生します。この機能では、自動的に 302 ジャンプが実行され、ジャンプの問題が繰り返し発生します。
それでは、この問題をどのように解決すればよいでしょうか?
まず、302 ジャンプの概念を理解する必要があります。 Web アプリケーションがリクエストを受信したとき、ジャンプする必要がある場合は、ステータス コード 302 の応答ヘッダーを返し、応答ヘッダーに Location 属性を設定して、どの新しい URI にリダイレクトするかをブラウザーに指示します。ブラウザーがこの応答ヘッダーを受信すると、新しい URI に対する新しい要求 (302 ジャンプ) が自動的に送信されます。
では、thinkphp のリダイレクト機能を使用すると、なぜジャンプが繰り返される問題が発生するのでしょうか?
実際には、この問題は thinkphp フレームワークのセッション メカニズムが原因で発生します。 thinkphp の Session クラスを使用してデータを保存すると、リクエストごとに session_start() オペレーションが自動的に実行されます。 session_start() 操作を実行すると、「Set-Cookie:PHPSESSID=xxxxxxxxxxxxxxx」のような応答ヘッダーが返され、「PHPSESSID」という名前の Cookie を設定する必要があることがブラウザに通知されます。ブラウザがこの応答ヘッダーを受信すると、この Cookie が要求ヘッダーに自動的に組み込まれます。サーバーは同じ PHPSESSID を持つリクエストを受信すると、これが同じセッションであると判断するため、リダイレクトせずに前の応答ヘッダーを直接返し、結果としてジャンプが繰り返されます。
この問題を解決するには 2 つの方法があり、いずれかを使用して問題を解決できます。
方法 1: リダイレクト関数を使用する場合、2 番目のパラメーターを追加して、302 ジャンプを実行せず、指定された URI に直接ジャンプするように関数に指示します。次のコードを使用できます。
$this->redirect('/index/index', [], 302, ['Pragma'=>'no-cache']);
4 番目のパラメーターは、応答ヘッダーの Pragma 属性を設定します。これにより、ブラウザーが現在のページをキャッシュすることが禁止され、キャッシュによって引き起こされる問題が回避されます。
方法 2: Session クラスを使用する場合、session_start() 操作を自動的に実行せず、手動で session_start() 操作を実行するように Session クラスに指示するコード行を追加します。次のコードを使用できます。
session('PHPSESSID', $_COOKIE['PHPSESSID']);
ここのコードは、ブラウザーによって送信された Cookie を PHPSESSID に手動で割り当てます。これにより、Session クラスは現在のセッションが同じセッションであると認識し、それによって問題が回避されます。繰り返されるジャンプ。
要約すると、繰り返しジャンプの問題は thinkphp フレームワークのセッション メカニズムが原因で発生します。この問題を解決する方法は、リダイレクト関数に Pragma 属性を追加するか、Session クラスを使用して手動で実行することです。 session_start() オペレーション。
以上がthinkphp でジャンプが繰り返される問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。