Dalam proses membangunkan aplikasi web menggunakan rangka kerja thinkphp, kadangkala kami menghadapi beberapa masalah lompat, seperti lompatan berulang. Keadaan ini biasanya berlaku apabila menggunakan fungsi ubah hala dalam Pengawal, yang secara automatik akan melakukan lompatan 302, dan kemudian menyebabkan masalah lompatan berulang.
Jadi bagaimana kita harus menyelesaikan masalah ini?
Pertama sekali, kita perlu memahami konsep lompat 302. Apabila aplikasi web menerima permintaan, jika ia perlu membuat lompatan, ia akan mengembalikan pengepala respons dengan kod status 302 dan menetapkan atribut Lokasi dalam pengepala respons untuk memberitahu penyemak imbas URI baharu yang hendak diubah hala. Apabila penyemak imbas menerima pengepala respons ini, ia secara automatik akan menghantar permintaan baharu untuk URI baharu, iaitu lompatan 302.
Jadi mengapa fungsi ubah hala thinkphp menyebabkan lompatan berulang?
Sebenarnya masalah ini berpunca daripada mekanisme sesi kerangka thinkphp. Apabila kami menggunakan kelas Sesi thinkphp untuk menyimpan beberapa data, ia secara automatik akan melaksanakan operasi session_start() pada setiap permintaan. Semasa menjalankan operasi session_start(), pengepala respons yang serupa dengan "Set-Cookie:PHPSESSID=xxxxxxxxxxxxxxx" akan dikembalikan, memberitahu penyemak imbas bahawa kuki bernama "PHPSESSID" perlu ditetapkan. Apabila penyemak imbas menerima pengepala respons ini, ia akan memasukkan kuki ini secara automatik dalam pengepala permintaan. Apabila pelayan menerima permintaan dengan PHPSESSID yang sama, ia akan berfikir bahawa ini adalah sesi yang sama, jadi ia tidak akan mengubah hala, tetapi terus mengembalikan pengepala respons sebelumnya, mengakibatkan lompatan berulang.
Ada dua cara untuk menyelesaikan masalah ini, kita boleh menggunakan mana-mana daripadanya untuk menyelesaikan masalah.
Kaedah 1: Apabila menggunakan fungsi ubah hala, tambah parameter kedua untuk memberitahu fungsi supaya tidak melakukan lompatan 302, tetapi melompat terus ke URI yang ditentukan. Anda boleh menggunakan kod berikut:
$this->redirect('/index/index', [], 302, ['Pragma'=>'no-cache']);
Parameter keempat adalah untuk menetapkan atribut Pragma bagi pengepala respons, yang melarang penyemak imbas daripada menyimpan cache halaman semasa, dengan itu mengelakkan masalah yang disebabkan oleh caching.
Kaedah 2: Apabila menggunakan kelas Sesi, tambah satu baris kod untuk memberitahu kelas Sesi supaya tidak secara automatik melaksanakan operasi session_start() tetapi untuk melaksanakan operasi session_start() secara manual. Anda boleh menggunakan kod berikut:
session('PHPSESSID', $_COOKIE['PHPSESSID']);
Kod di sini adalah untuk menetapkan secara manual kuki yang dihantar oleh penyemak imbas kepada PHPSESSID, supaya kelas Sesi menganggap ia adalah sesi yang sama, dengan itu mengelakkan masalah berulang melompat.
Untuk meringkaskan, masalah lompatan berulang disebabkan oleh mekanisme sesi rangka kerja thinkphp Cara untuk menyelesaikan masalah ini ialah dengan menambah atribut Pragma pada fungsi ubah hala, atau menggunakan kelas Sesi untuk melaksanakan secara manual. operasi session_start().
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah lompatan berulang dalam thinkphp. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!