Bagaimana cara melakukan pengalihan dalam PHP?

1262

Apakah mungkin mengarahkan pengguna ke halaman lain melalui penggunaan PHP?

Katakanlah pengguna pergi ke www.example.com/page.phpdan saya ingin mengarahkan mereka ke www.example.com/index.php, bagaimana saya akan melakukannya tanpa menggunakan meta refresh? Apa itu mungkin?

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

Sam
sumber
Anda dapat memperbarui header di PHP: header
Zack Marrapese
11
@ Sam: sama seperti node samping, jangan mengimplementasikan segala bentuk protection from unauthorized usersvia redirect; ini bukan bagaimana hal-hal harus dilakukan;)
Strae
7
@ Trae Apa yang salah dengan melindungi halaman dengan redirect? Lalu apa cara terbaik?
6
Redirect @PravindaAmarathunga adalah salah satu elemen, tetapi bukan satu-satunya. Pastikan saja bahwa elemen yang dilindungi tidak dapat dihasilkan sama sekali untuk pengguna yang tidak sah; Pengalihan browser dapat dinonaktifkan di sisi klien, misalnya: jika browser tidak melakukan pengalihan dan halaman asli akan dikeluarkan seperti biasa, apa yang akan dilihat pengguna? CMS biasanya melakukan redirect dan tidak mencetak item yang dilindungi, menggantikan output normal dengan pesan sopan santun.
Strae
@PravindaAmarathunga memeriksa tautan dari jawaban markus: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Strae

Jawaban:

1699

Ringkasan jawaban yang ada ditambah dua sen saya sendiri:

1. Jawaban dasar

Anda dapat menggunakan header()fungsi untuk mengirim header HTTP baru, tetapi ini harus dikirim ke browser sebelum HTML atau teks apa pun (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 menggunakan die()atau exit(): The Daily WTF

URL absolut atau relatif

Sejak Juni 2014, URL absolut dan relatif dapat digunakan. Lihat RFC 7231 yang telah menggantikan RFC 2616 lama , di mana hanya URL absolut yang diizinkan.

Kode Status

Header "Lokasi" PHP masih menggunakan kode HTTP- directirect HTTP 302 , tetapi ini bukan kode yang harus Anda gunakan. Anda harus mempertimbangkan 301 (pengalihan permanen) atau 303 (lainnya).

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

3. Dokumentasi

Tajuk HTTP dan header()fungsinya dalam PHP

4. Alternatif

Anda dapat menggunakan metode alternatif http_redirect($url);yang membutuhkan paket PECL untuk diinstal.

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. Penanganan masalah

Seperti yang disebutkan header()arahan ulang hanya bekerja sebelum ada yang ditulis. Mereka biasanya gagal jika dipanggil dalam output HTML pertengahan . Maka Anda dapat menggunakan solusi header HTML (tidak terlalu profesional!) Seperti:

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

Atau bahkan pengalihan JavaScript.

window.location.replace("http://example.com/");
markus
sumber
5
Beberapa masalah dengan jawaban ini: 303 mungkin bukan kode status "benar". 301 mungkin diinginkan untuk Google, misalnya. Kedua, header('Location: '.$newURL);harus sebelum HTML (atau teks) apa pun telah diteruskan ke browser, atau itu tidak akan berfungsi dengan benar.
Chuck Le Butt
6
Kisah WTF harian adalah yang biasa, sayangnya. Lagi pula, itu bukan yang hilang yang menyebabkan masalah tetapi desain yang buruk. Menutup proses dengan kekerasan adalah salah dalam 99,9% kasus. Solusi umum dan bersih (bukan yang paling saya sukai) adalah melempar RedirectionException dan menangkapnya pada titik masuk aplikasi Anda. Setelah itu, Anda dapat memiliki semua panggilan "setelah *" (log / tutup koneksi / apa pun)
robertodecurnex
4
Ini http-equiv="Location"tidak didukung oleh semua browser. Anda harus menggunakannya refresh! <meta http-equiv="refresh" content="0;url=http://example.com/">
Timo002
71
Jangan pernah mengeluarkan 301 kecuali Anda bersungguh-sungguh . 301 berarti permanen, dan permanen berarti permanen , artinya itu akan di-cache oleh agen pengguna, yang berarti malam yang panjang, dipenuhi kafein menatap log aplikasi bertanya-tanya apakah Anda akan menjadi gila karena Anda bersumpah beberapa halaman seharusnya dipanggil atau diperbarui dan Anda bersumpah kepada Tuhan itu bekerja pada mesin Anda tetapi tidak pada klien. Jika Anda benar-benar harus memanggil 301, letakkan usia maks kontrol cache pada sumber daya. Anda tidak memiliki kebijaksanaan yang tak terbatas dan Anda seharusnya tidak bertindak seperti Anda.
madumlao
2
Tetapi apakah ada alasan untuk menggunakan die over? keluar sepertinya lebih bersih dan lebih tepat.
ars265
122

Gunakan header()fungsi ini untuk mengirim tajuk HTTPLocation :

header('Location: '.$newURL);

Bertentangan dengan apa yang beberapa orang pikirkan, die()tidak ada hubungannya dengan pengalihan. Gunakan hanya jika Anda ingin mengarahkan alih - alih eksekusi normal.

File example.php :

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

Hasil dari tiga 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. Itu tidak ada hubungannya dengan klien "menghormati" Location:header. Mengirim header tidak menghentikan eksekusi PHP, terlepas dari klien yang digunakan.

vartec
sumber
8
die () atau exit () adalah untuk klien yang tidak menghormati header "Lokasi: ..."
clawr
12
@ clawr: Tidak, exit()adalah untuk mencegah halaman menampilkan konten yang tersisa (pikirkan halaman terbatas). vartec benar, itu tidak ada hubungannya dengan header Lokasi HTTP dan Anda tidak perlu melakukannya exit. Saya memilih untuk memasukkannya dalam jawaban saya karena, bagi seseorang yang tidak tahu bagaimana melakukan redirect sederhana , orang mungkin juga bermain aman daripada tidak menerapkan langkah sederhana namun penting hanya supaya dia dapat mengambil keuntungan dari proses lanjutan kontrol.
Alix Axel
1
Tetapi browser yang menghormati header akan meninggalkan halaman dan menutup koneksi saat skrip Anda masih dieksekusi. Ini sangat buruk. PHP akan melanjutkan dengan skrip untuk beberapa waktu (itu sebabnya kode Anda dieksekusi) tetapi dapat membatalkannya secara acak di tengah eksekusi, sehingga barang rusak. Memanggil Abaikan_user_abort () akan mencegah ini, tapi sungguh saya itu tidak layak. Lanjutkan dengan hal-hal penulisan HTML Anda (meskipun mungkin tidak berguna) tetapi jangan lakukan hal-hal yang menulis pada disk atau database setelah header ('Lokasi:'); Tulis ke disk sebelum pengalihan jika memungkinkan. [Juga: url harus absolut.]
FrancescoMM
apakah ada cara untuk mengarahkan ulang sebelum browser mendeteksi protokol HTTP? alasan saya perlu mengarahkan ulang adalah karena saya tidak bisa mendapatkan sertifikat SSL yang cukup untuk semua domain saya. saya akan gunakan .htaccessuntuk mengarahkan ulang, tetapi saya perlu cara untuk entah bagaimana meneruskan domain mana yang diarahkan ke domain akhir?
oldboy
109
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 untuk mati () / keluar ()!

Alix Axel
sumber
6
Dan jangan lupa buffering output atau Anda akan berakhir dengan 'Header sudah terkirim'.
Kuroki Kaze
8
... dan jangan lupa cetak di suatu tempat seperti "Anda akan dialihkan ke $ nepage dalam $ n detik, klik $ tautan di sini jika pengalihan tidak terjadi" Beberapa broser, dan beberapa pengaturan browser, mungkin gagal pengalihan itu.
Strae
3
@ DaNieL: jenis pengalihan ini tidak akan memakan waktu "$ n detik". Ini akan instan jika itu terjadi sama sekali, dan browser yang sesuai harus menanganinya. Saya pikir Anda sedang memikirkan pengalihan "meta refresh" yang digunakan orang ketika mereka tidak tahu apa-apa.
rmeador
1
@rmeador ... Untuk peramban lama dan peramban khusus. Pertama-tama Anda harus melakukan header Lokasi Anda, jika gagal memiliki meta-redirect dengan "Anda akan diarahkan ke halaman dalam x detik" dengan tautan jika meta-redirect gagal. Itu cara yang tepat dan gagal-aman untuk melakukan pengalihan.
Andrew Moore
3
Andrew: bagaimana bisa browser HTTP tidak menghargai Lokasi :?
vartec
102

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

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 tajuk adalah hal pertama yang dikirim dari halaman. Sebagian besar pengalihan biasanya diperlukan nanti di halaman. Untuk itu Anda harus melakukan buffer semua output halaman dan memeriksa kondisi redirect nanti. Pada titik itu Anda dapat mengarahkan ulang tajuk pengguna halaman () atau cukup menggemakan output buffered.

Untuk lebih lanjut tentang buffering (keuntungan)

Apa itu buffering output?

Hammad Khan
sumber
2
Sederhana dan to the point menjawab! Bagus untuk pengalihan halaman sederhana!
Stathis Andronikos
Dan dengan cara itu Anda tidak mengalami Cannot modify header information - headers already sent bykesalahan umum .
Kai Noack
1
@ hmd, bagaimana jika javascript dinonaktifkan?
Istiaque Ahmed
@IstiaqueAhmed javascript hampir selalu diaktifkan hari ini tetapi jika dinonaktifkan maka Anda dapat menggunakan buffer PHP. Pertanyaan SO ini menjawab itu. Jika Anda menggunakan PHP Buffering maka Anda tidak perlu metode ini, saya mengerti.
Hammad Khan
Salah, Anda bisa (dan harus) melakukannya dalam PHP bahkan tanpa buffering: di halaman yang dirancang dengan baik semua pemrosesan PHP yang relevan harus dilakukan sebelum konten HTML dikirim ke pengguna. Dengan begitu pengalihan PHP akan berfungsi dengan baik.
MestreLion
91

1. Menggunakan fungsi header dengan exit()

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

tetapi jika Anda menggunakan fungsi tajuk maka beberapa kali Anda akan mendapatkan "peringatan seperti tajuk sudah dikirim" untuk menyelesaikan yang tidak menggema atau mencetak sebelum mengirim tajuk atau Anda dapat menggunakan die()atau exit()setelah fungsi tajuk.

2. Tanpa tajuk

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

di sini Anda tidak akan menghadapi masalah

3. Menggunakan fungsi header dengan ob_start()danob_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
?>
Junari Ansari
sumber
Bekerja seperti pesona. Saya menggunakan <? Php echo "<script> location.href = ' google.fr /'; </script >"; ?> Untuk mengujinya, dan itu melakukan apa yang saya inginkan
DoctorDroid Haiti
1
Solusi kedua tidak akan berfungsi jika JS dinonaktifkan.
Tajni
55

Sebagian besar jawaban ini melupakan langkah yang sangat penting!

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

Meninggalkan baris kedua yang penting itu mungkin membuat Anda berakhir di The Daily WTF . Masalahnya adalah browser tidak harus menghormati header yang halaman Anda kembalikan, jadi dengan header yang diabaikan, sisa halaman akan dieksekusi tanpa arahan ulang.

nickf
sumber
1
Bagaimana dengan memberikan output kepada pengguna sebelum mematikan skrip? Anda tahu, orang suka tahu apa yang terjadi ...
Strae
3
Anda berasumsi bahwa skrip tidak ada hubungannya kecuali mengarahkan ulang. Yang mungkin tidak benar sama sekali.
vartec
13
@DaNieL: ubah ke mati ("Berhenti mengabaikan header saya!")
nickf
3
Saya menyukai penjelasan sederhana yang die();Anda berikan - jika Anda tidak melakukannya, pengguna dapat melihat halaman lengkap sejenak jika Anda menggunakannya; pengguna akan dialihkan dan tidak ada kesalahan konten sementara akan menunjukkan +1
TheBlackBenzKid
Dimungkinkan untuk memiliki aktivitas yang bermanfaat terjadi setelah header dikirim, aktivitas yang tidak mengirim apa pun ke browser, tetapi mencatat aktivitas atau menyelesaikan pencatatan transaksi. Untuk alasan ini, kebutuhan untuk mati / keluar tergantung pada skrip.
DanAllen
28

Menggunakan:

<?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 mengarahkan ke halaman eksternal, misalnya:

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

Pastikan Anda memasukkan exit()atau memasukkan die().

jake
sumber
25

Anda dapat menggunakan variabel sesi untuk mengontrol akses ke halaman dan mengotorisasi pengguna yang valid juga:

<?php
    session_start();

    if (!isset( $_SESSION["valid_user"]))
    {
        header("location:../");
        exit();
    }

    // Page goes here
?>

http://php.net/manual/en/reserved.variables.session.php .

Baru-baru ini, saya mendapat serangan dunia maya dan memutuskan, saya perlu tahu para pengguna yang mencoba mengakses Panel Admin atau bagian cadangan dari Aplikasi web.

Jadi, saya menambahkan akses log untuk alamat IP dan sesi pengguna dalam file teks, karena saya tidak ingin mengganggu database saya.

Asuquo12
sumber
19

Banyak dari jawaban ini benar, tetapi mereka menganggap Anda memiliki URL absolut, yang mungkin tidak demikian. Jika Anda ingin menggunakan URL relatif dan menghasilkan sisanya, maka Anda dapat melakukan sesuatu seperti ini ...

$url = 'http://' . $_SERVER['HTTP_HOST'];            // Get the server
$url .= rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); // Get the current directory
$url .= '/your-relative/path-goes/here/';            // <-- Your relative path
header('Location: ' . $url, true, 302);              // Use either 301 or 302
Luke
sumber
16

header( 'Location: http://www.yoursite.com/new_page.html' );

Daniel A. White
sumber
apakah ada cara untuk mengarahkan ulang sebelum browser mendeteksi protokol HTTP? alasan saya perlu mengarahkan ulang adalah karena saya tidak bisa mendapatkan sertifikat SSL yang cukup untuk semua domain saya. saya akan gunakan .htaccessuntuk mengarahkan ulang, tetapi saya perlu cara untuk entah bagaimana meneruskan domain mana yang diarahkan ke domain akhir?
oldboy
16

Gunakan kode berikut:

header("Location: /index.php");
exit(0);   
joan16v
sumber
14

Saya sudah menjawab pertanyaan ini, tetapi saya akan melakukannya lagi karena sementara itu saya telah belajar bahwa ada kasus-kasus khusus jika Anda menjalankan CLI (pengalihan tidak dapat terjadi dan karenanya tidak boleh exit()) atau jika server web Anda menjalankan PHP sebagai (F) CGI (perlu Statusheader yang sebelumnya diatur untuk mengarahkan ulang dengan benar).

function Redirect($url, $code = 302)
{
    if (strncmp('cli', PHP_SAPI, 3) !== 0)
    {
        if (headers_sent() !== true)
        {
            if (strlen(session_id()) > 0) // If using sessions
            {
                session_regenerate_id(true); // Avoids session fixation attacks
                session_write_close(); // Avoids having sessions lock other requests
            }

            if (strncmp('cgi', PHP_SAPI, 3) === 0)
            {
                header(sprintf('Status: %03u', $code), true, $code);
            }

            header('Location: ' . $url, true, (preg_match('~^30[1237]$~', $code) > 0) ? $code : 302);
        }

        exit();
    }
}

Saya juga sudah menangani masalah ini mendukung kode HTTP redirection yang berbeda ( 301, 302, 303dan 307), seperti yang dibahas dalam komentar-komentar dari jawaban saya sebelumnya. Berikut uraiannya:

  • 301 - Dipindahkan Secara Permanen
  • 302 - Ditemukan
  • 303 - Lihat Lainnya
  • 307 - Pengalihan Sementara (HTTP / 1.1)
Alix Axel
sumber
11

Untuk mengarahkan pengunjung ke halaman lain (khususnya berguna dalam loop kondisional), cukup gunakan kode berikut:

<?php
    header('Location: mypage.php');
?>

Dalam hal ini, mypage.phpadalah alamat halaman yang Anda inginkan untuk mengarahkan pengunjung. Alamat ini bisa bersifat absolut dan mungkin juga menyertakan parameter dalam format ini:mypage.php?param1=val1&m2=val2)

Relative / Absolute Path

Saat berurusan dengan jalur relatif atau absolut, sangat ideal untuk memilih jalur absolut dari root server (DOCUMENT_ROOT). Gunakan format berikut:

<?php
    header('Location: /directory/mypage.php');
?>

Jika halaman target ada di server lain, Anda memasukkan URL lengkap:

<?php
    header('Location: http://www.ccm.net/forum/');
?>

Tajuk HTTP

Menurut protokol HTTP, header HTTP harus dikirim before semua jenis konten. Ini berarti bahwa tidak ada karakter yang harus dikirim sebelum header - bahkan tidak ada ruang kosong!

Pengalihan Sementara / Permanen

Secara default, jenis pengalihan yang disajikan di atas adalah yang sementara. Ini berarti bahwa mesin pencari, seperti Google Search, tidak akan mempertimbangkan pengalihan saat pengindeksan.

Jika Anda ingin memberi tahu mesin pencari bahwa suatu halaman telah dipindahkan secara permanen ke lokasi lain, gunakan kode berikut:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: new_address');
?>

Misalnya, halaman ini memiliki kode berikut:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: /pc/imprimante.php3');
    exit();
?>

Ketika Anda mengklik tautan di atas, Anda secara otomatis diarahkan ke halaman ini. Selain itu, ini merupakan pengalihan permanen (Status: 301 Dipindahkan Secara Permanen). Jadi, jika Anda mengetik URL pertama ke Google, Anda akan secara otomatis diarahkan ke tautan kedua, diarahkan.

Interpretasi Kode PHP

Kode PHP yang terletak setelah tajuk () akan ditafsirkan oleh server, bahkan jika pengunjung pindah ke alamat yang ditentukan dalam pengalihan. Dalam kebanyakan kasus, ini berarti bahwa Anda memerlukan metode untuk mengikuti header()fungsi exit()fungsi untuk mengurangi beban server:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>
Bintang
sumber
Mengapa (mendekati akhir paragraf kedua)? Apakah maksud Anda &parasebagai gantinya (jadi seluruh bacaan mypage.php?param1=val1&param2=val2))? (HTML entity para ) adalah "¶" - mungkin beberapa program eksternal melakukan konversi)?.
Peter Mortensen
9

Menggunakan:

<?php
    header('Location: redirectpage.php');
    header('Location: redirectpage.php');
    exit();
    echo "<script>location.href='redirectpage.php';</script>";
?>

Ini adalah redirect PHP biasa dan normal, tetapi Anda dapat membuat halaman redirect dengan beberapa detik menunggu dengan kode di bawah ini:

<?php
    header('refresh:5;url=redirectpage.php '); // Note: here 5 means 5 seconds wait for redirect.
?>
Obaidul Haque
sumber
7

Menjelang web semantik, kebenaran adalah sesuatu yang perlu dipertimbangkan. Sayangnya, "Lokasi" PHP-header masih menggunakan kode HTTP- directirect HTTP 302 , yang, sebenarnya, bukan yang terbaik untuk pengalihan. Yang seharusnya digunakan, adalah 303 .

W3C berbaik hati untuk menyebutkan bahwa 303-header tidak kompatibel dengan "banyak agen pengguna pra-HTTP / 1.1," yang berarti tidak ada browser yang digunakan saat ini. Jadi, 302 adalah peninggalan, yang seharusnya tidak digunakan.

... atau Anda bisa mengabaikannya, seperti orang lain ...

Henrik Paul
sumber
7

Anda dapat menggunakan beberapa metode JavaScript seperti di bawah ini

  1. self.location="http://www.example.com/index.php";

  2. window.location.href="http://www.example.com/index.php";

  3. document.location.href = 'http://www.example.com/index.php';

  4. window.location.replace("http://www.example.com/index.php");

Vikram Pote
sumber
Javascript berjalan pada klien yang mungkin atau tidak mungkin apa yang Anda cari.
chharvey
7

Ya, Anda bisa menggunakan fungsi header () ,

header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */
exit();

Dan juga praktik terbaik adalah memanggil keluar () fungsi tepat setelah header()fungsi untuk menghindari eksekusi kode di bawah ini.

Menurut dokumentasi, header()harus dipanggil sebelum output aktual dikirim.

Casper
sumber
6

Seperti yang dikatakan orang lain di sini, mengirim tajuk lokasi dengan:

header( "Location: http://www.mywebsite.com/otherpage.php" );

tetapi Anda harus melakukannya sebelum mengirim output lain ke browser.

Juga, jika Anda akan menggunakan ini untuk memblokir pengguna yang tidak diautentikasi dari halaman tertentu, seperti yang Anda sebutkan, perlu diingat bahwa beberapa agen pengguna akan mengabaikan ini dan melanjutkan ke halaman saat ini, jadi Anda harus mati ( ) setelah Anda mengirimnya.

Brent
sumber
but you need to do it before you've sent any other output to the browser. Hebat !! Telah mencari beberapa menit tentang mengapa saya terus menerima header yang sudah mengirim kesalahan. +1 !!
Astaga
Lebih umum, Anda memiliki / menghentikan skrip Anda sepenuhnya /. die()hanyalah satu cara untuk melakukan itu.
MauganRa
6

Inilah pikiran saya:

IMHO, cara terbaik untuk mengarahkan kembali permintaan yang masuk adalah dengan menggunakan header lokasi, yang berjalan

<?php
    header("Location: /index.php");
?>

Setelah pernyataan ini dieksekusi, dan output dikirim, browser akan mulai mengarahkan kembali pengguna. Namun, pastikan bahwa belum ada output (echo / var_dump) sebelum mengirim header, jika tidak maka akan menyebabkan kesalahan.

Meskipun ini adalah cara cepat dan kotor untuk mencapai apa yang awalnya diminta, itu akhirnya akan menjadi bencana SEO, karena pengalihan seperti ini selalu diartikan sebagai pengalihan 301/302, maka mesin pencari akan selalu melihat Anda halaman indeks sebagai halaman arahan ulang, dan bukan halaman arahan / halaman utama.

Oleh karena itu akan mempengaruhi pengaturan SEO situs web.

Bhaskar Pramanik
sumber
1
exit () harus digunakan segera setelah header ()
EKanadily
@ docesam .. setuju .. keluar () harus segera dipanggil setelah panggilan tajuk (). Namun saya merasa, jika tidak ada lagi output ke browser setelah pernyataan header () ini, exit () mungkin tidak diperlukan - Hanya pendapat saya
Bhaskar Pramanik
ya tetapi Anda harus menjelaskannya karena seseorang dapat menyalin baris kode Anda ke skripnya dan itu berpotensi menyebabkan waktu berputar-putar di sekelilingnya sendiri untuk mencari tahu apa yang salah.
EKanadily
1
@ BhaskarPramanik bayangkan Anda harus mengunci pintu dengan cepat, tetapi kemudian Anda harus menarik / mendorong / menghancurkannya lagi untuk memastikan apakah pintu sudah terkunci atau tidak ..
aswzen
5

Cara terbaik untuk mengarahkan ulang dengan PHP adalah kode berikut ...

 header("Location: /index.php");

Pastikan tidak ada kode yang akan berfungsi setelahnya

header("Location: /index.php");

Semua kode harus dijalankan sebelum baris di atas.

Seharusnya,

Kasus 1:

echo "I am a web developer";
header("Location: /index.php");

Ini akan mengarahkan ulang dengan benar ke lokasi (index.php).

Kasus 2:

return $something;
header("Location: /index.php");

Kode di atas tidak akan mengarahkan ulang ke lokasi (index.php).

sabuz
sumber
Sudah ada jawaban yang memiliki 1085 yang berisi info yang Anda berikan, ditambah banyak lagi.
Patrick Hund
5

Ya, mungkin menggunakan PHP. Kami akan mengalihkan ke halaman lain.

Coba kode berikut:

<?php
    header("Location:./"); // Redirect to index file
    header("Location:index.php"); // Redirect to index file
    header("Location:example.php");
?>
Bhargav Chudasama
sumber
4

1. Menggunakan header, fungsi PHP bawaan

a) Redirect sederhana tanpa parameter

<?php
   header('Location: index.php');
?>

b) Redirect dengan parameter GET

<?php
      $id = 2;
      header("Location: index.php?id=$id&msg=succesfully redirect");
  ?>

2. Redirect dengan JavaScript di PHP

a) Redirect sederhana tanpa parameter

<?php
     echo "<script>location.href='index.php';</script>";
 ?>

b) Redirect dengan parameter GET

<?php
     $id = 2;
     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";
   ?>
Shaan Ansari
sumber
Bit javascript entah bagaimana adalah satu-satunya hal yang bekerja di hosting akhir situs; Saya percaya ini masalah caching tetapi dengan itu saya segera menyelesaikannya.
cdsaenz
3

Kita dapat melakukannya dengan dua cara:

  1. Ketika pengguna datang di https://bskud.com/PINCODE/BIHAR/index.php, kemudian arahkan ke https://bskud.com/PINCODE/BIHAR.php

    Dengan kode PHP di bawah ini

    <?php
        header("Location: https://bskud.com/PINCODE/BIHAR.php");
        exit;
    ?>

    Simpan kode di atas dalam https://bskud.com/PINCODE/BIHAR/index.php

  2. Ketika kondisi apa pun benar maka arahkan ke halaman lain:

    <?php
        $myVar = "bskud";
        if ($myVar == "bskud") {
    ?>
    
    <script> window.location.href="https://bskud.com";  </script>
    
    <?php
        }
        else {
            echo "<b>Check the website name again</b>";
        }
    ?>
Kavita Sharma
sumber
Apa ini? Tolong jangan gunakan tautan ke situs web Anda sendiri. Dan contoh kedua menggunakan redirect javascript, dan bukan header()fungsi PHP .
Penulis naskah
2

Menggunakan:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>
Joshua Charles Pickwell
sumber
1
Bisakah Anda menjelaskan fungsi kode Anda? Jawaban Anda ditandai karena panjang dan isinya.
www139
2

Ada beberapa cara untuk melakukan ini, tetapi jika Anda lebih suka php, saya akan merekomendasikan penggunaan header()fungsi ini.

Pada dasarnya

$your_target_url = www.example.com/index.php”;
header(“Location : $your_target_url”);
exit();

Jika Anda ingin menendang takik, yang terbaik adalah menggunakannya dalam fungsi. Dengan begitu, Anda dapat menambahkan otentikasi dan memeriksa elemnts lainnya di dalamnya.

Mari kita coba dengan memeriksa level pengguna.

Jadi, misalkan Anda telah menyimpan tingkat otoritas pengguna dalam sesi yang disebut u_auth.

Dalam function.php

<?php
    function authRedirect($get_auth_level,
                          $required_level,
                          $if_fail_link = www.example.com/index.php”){
        if ($get_auth_level != $required_level){
            header(location : $if_fail_link);
            return false;
            exit();
        }
        else{
            return true;
        }
     }

     . . .

Anda kemudian akan memanggil fungsi untuk setiap halaman yang ingin Anda otentikasi.

Seperti di page.phpatau halaman lainnya.

<?php

    // page.php

    require function.php

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 5
    authRedirect($_SESSION[‘u_auth’], 5);

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 4
    authRedirect($_SESSION[‘u_auth’], 4);

    // Redirects to www.someotherplace.com/somepage.php if the
    // user isn’t authentication level 2
    authRedirect($_SESSION[‘u_auth’], 2, www.someotherplace.com/somepage.php”);

    . . .

Referensi;

Pyr James
sumber
2

Saya suka jenis pengalihan dari waktu ke waktu.

<?php

header("Refresh: 5;url=índex.php");
PauloBoaventura
sumber
2

Menggunakan fungsi header untuk routing

<?php
     header('Location: B.php');
     exit();
?>

Misalkan kita ingin rute dari a.php file b.php daripada kita harus mengambil bantuan <button>atau <a>. Mari kita lihat sebuah contoh

<?php
if(isset($_GET['go_to_page_b'])) {
    header('Location: B.php');
    exit();

}
?>

<p>I am page A</p>
<button name='go_to_page_b'>Page B</button>

B.php

<p> I am Page B</p>
Mehedi Abdullah
sumber
Bisakah Anda memberikan solusi yang akurat atau bagus?
Mehedi Abdullah
Sudah ada banyak solusi. Solusi Anda memiliki campuran HTML dan PHP tanpa tag PHP. Kedua Anda mengirim tajuk setelah mencetak kode html, sehingga tidak akan berfungsi. Dan nama file contoh buruk. Anda seharusnya tidak menamainya A.php dan B.php. Saya tahu itu hanya contoh, tetapi Anda tetap harus peduli tentang penamaan konvensi.
Tajni
1

Jika Anda menjalankan di Apache Anda juga dapat menggunakan .htaccess untuk mengarahkan ulang.

Redirect 301 / http://new-site.com/
michal.jakubeczy
sumber
1

Anda dapat mencoba menggunakan headerfungsi PHP untuk melakukan pengalihan. Anda akan ingin mengatur buffer output sehingga browser Anda tidak melemparkan peringatan pengalihan ke layar.

ob_start();
header("Location: " . $website);
ob_end_flush();
Doruk Ayar
sumber
1
exit () harus digunakan segera setelah header (). juga keluar buffering secara otomatis telah aktif secara default untuk beberapa waktu sekarang.
EKanadily
0

coba yang ini

 $url = $_SERVER['HTTP_REFERER'];
 redirect($url);
Shareque
sumber