Pertanyaan Bagaimana cara membuat pengalihan dalam PHP?


Apakah mungkin untuk mengarahkan pengguna ke halaman yang berbeda melalui penggunaan PHP?

Katakanlah pengguna pergi ke www.example.com/page.php dan saya ingin mengarahkan mereka ke www.example.com/index.php, bagaimana saya melakukannya tanpa menggunakan penyegaran meta? Mungkin?

Ini bahkan bisa melindungi halaman saya dari pengguna yang tidak sah.


983
2018-04-20 14:13


asal


Jawaban:


Ringkasan jawaban yang ada ditambah dua sen saya sendiri:

1. Jawaban dasar

Anda dapat menggunakan header() berfungsi untuk mengirim header HTTP baru, tetapi ini harus dikirim ke browser sebelum HTML atau teks (jadi sebelum <!DOCTYPE ...> deklarasi, misalnya).

header('Location: '.$newURL);

2. Detail penting

mati() atau keluar()

header("Location: http://example.com/myOtherPage.php");
die();

Mengapa Anda harus menggunakannya die() atau exit(): The Daily WTF

URL Mutlak

URL harus mutlak. Lihat RFC 2616. Namun dalam banyak kasus, URL relatif akan diterima juga.

Kode Status

Php "Lokasi" PHP masih menggunakan HTTP 302kode -redirect, tetapi ini bukan yang harus Anda gunakan. Anda juga harus mempertimbangkannya 301 (pengalihan permanen) atau 303 (lain).

catatan: W3C menyebutkan bahwa header 303 tidak kompatibel dengan "banyak agen pengguna pra-HTTP / 1.1. Peramban yang digunakan saat ini adalah semua agen pengguna HTTP / 1.1. Ini tidak berlaku untuk banyak agen pengguna lain seperti spider dan robot.

3. Dokumentasi

Header HTTP dan header() berfungsi dalam PHP

4. Alternatif

Anda dapat menggunakan metode alternatif http_redirect($url); yang membutuhkan Paket PECL pecl untuk dipasang.

5. Fungsi Pembantu

Fungsi ini tidak memasukkan kode status 303:

function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

Redirect('http://example.com/', false);

Ini lebih fleksibel:

function redirect($url, $statusCode = 303)
{
   header('Location: ' . $url, true, $statusCode);
   die();
}

6. solusi

Seperti yang telah disebutkan header() redirect hanya berfungsi sebelum ada yang ditulis. Mereka biasanya gagal jika menggunakan HTML inmidst keluaran. Maka Anda mungkin menggunakan solusi tandas HTML (tidak sangat profesional!) Seperti:

 <meta http-equiv="refresh" content="0;url=finalpage.html">

Atau bahkan JavaScript redirect.

window.location.replace("http://example.com/");

1402
2018-04-20 14:19



function Redirect($url, $permanent = false)
{
    if (headers_sent() === false)
    {
        header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
    }

    exit();
}

Redirect('http://www.google.com/', false);

Jangan lupa mati () / keluar ()!


89
2018-06-27 07:24



Output JavaScript dari PHP menggunakan echo, yang akan melakukan pekerjaan.

echo '<script type="text/javascript">
           window.location = "http://www.google.com/"
      </script>';

Anda tidak dapat benar-benar melakukannya dalam PHP kecuali Anda buffer output halaman dan kemudian memeriksa kondisi redirect. Itu mungkin terlalu merepotkan. Ingat bahwa header adalah hal pertama yang dikirim dari halaman. Sebagian besar pengalihan biasanya diperlukan nanti di halaman. Untuk itu Anda harus menyangga semua output halaman dan memeriksa kondisi pengalihan nanti. Pada titik itu Anda dapat mengarahkan kembali header pengguna halaman () atau hanya echo output buffered.

Untuk informasi lebih lanjut tentang buffering (kelebihan)

Apa itu buffering output?


86
2018-04-20 14:14



Menggunakan header() fungsi mengirim HTTP Location tajuk:

header('Location: '.$newURL);

Bertentangan dengan beberapa orang berpikir, die() tidak ada hubungannya dengan redirection. Gunakan hanya jika Anda ingin mengalihkan sebagai gantinya eksekusi normal.

example.php:

<?php 
header('Location: static.html');
$fh = fopen('/tmp/track.txt','a');
fwrite($fh, $_SERVER['REMOTE_ADDR'].' '.date('c')."\n");
fclose($fh);
?>

Hasil atau 3 eksekusi:

bart@hal9k:~> cat /tmp/track.txt
127.0.0.1 2009-04-21T09:50:02+02:00
127.0.0.1 2009-04-21T09:50:05+02:00
127.0.0.1 2009-04-21T09:50:08+02:00

Melanjutkan - wajib die()/exit() adalah beberapa legenda urban, yang tidak ada hubungannya dengan PHP yang sebenarnya. Tidak ada hubungannya dengan klien "menghormati" Location: tajuk. Mengirim header tidak menghentikan eksekusi PHP, terlepas dari klien yang digunakan.


79
2018-04-13 12:44



1. Menggunakan fungsi header dengan exit()

<?php 
     header('Location: target-page.php');
     exit();
?>

tetapi jika Anda menggunakan fungsi header maka beberapa kali Anda akan mendapatkan "PERINGATAN  seperti tajuk sudah kirim " untuk menyelesaikan yang tidak gema atau cetak sebelum mengirim header atau Anda dapat menggunakan die() atau exit() setelah fungsi header.

2. Tanpa header

<?php 
    echo "<script>location.href='target-page.php';</script>";
?>

di sini Anda tidak akan menghadapi masalah apa pun

3. Menggunakan fungsi header dengan ob_start() dan ob_end_flush()

<?php
ob_start(); //this should be first line of your page
header('Location: target-page.php');
ob_end_flush(); //this should be last line of your page
?>

57
2018-04-20 14:24



Sebagian besar dari jawaban ini melupakan a sangat langkah penting!

header("Location: myOtherPage.php");
die();

Membiarkan garis kedua yang vital itu mungkin akan membuat Anda berakhir The Daily WTF. Masalahnya adalah browser tidak memiliki untuk menghormati header yang dikembalikan laman Anda, sehingga dengan mengabaikan header, sisa laman akan dijalankan tanpa pengalihan.


49
2018-05-16 13:12



<?php header('Location: another-php-file.php'); exit(); ?>

atau jika Anda sudah membuka tag php, gunakan ini:

header('Location: another-php-file.php'); exit();

Anda juga dapat mengalihkan ke halaman eksternal, misalnya:

header('Location: https://www.google.com'); exit();

Pastikan Anda memasukkan exit() atau include die()


23
2018-01-15 04:21