it-swarm.asia

Bagaimana cara melakukan pengalihan dalam PHP?

Apakah mungkin mengarahkan pengguna ke halaman lain 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 meta refresh? Apa itu mungkin?

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

1130
Sam

Ringkasan jawaban yang ada ditambah dua sen saya sendiri:

1. Jawaban dasar

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

header('Location: '.$newURL);

2. Rincian penting

die () atau keluar ()

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

Mengapa Anda harus menggunakan die() atau exit(): WTF Harian

URL absolut atau relatif

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

Kode Status

"Lokasi" PHP-header masih menggunakan HTTP 302 - redirect code, tetapi ini bukan yang harus Anda gunakan. Anda harus mempertimbangkan 301 (redirect permanen) atau 303 (lainnya).

Catatan: W3C menyebutkan bahwa header-303 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

Header HTTP dan fungsi header() dalam PHP

4. Alternatif

Anda dapat menggunakan metode alternatif http_redirect($url); yang membutuhkan paket PecEC 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 disebutkan header() pengalihan hanya berfungsi sebelum ada yang ditulis. Mereka biasanya gagal jika memunculkan HTML output inmidst. 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/");
1569
markus

Gunakan fungsi header() untuk mengirim HTTP Location header :

header('Location: '.$newURL);

Bertentangan dengan apa yang dipikirkan beberapa orang, die() tidak ada hubungannya dengan pengalihan. Gunakan only jika Anda ingin mengarahkan sebagai gantinya dari 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:

[email protected]:~> 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" header Location:. Mengirim header tidak menghentikan eksekusi PHP, terlepas dari klien yang digunakan.

102
vartec
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 ()!

101
Alix Axel

Keluarkan JavaScript dari PHP menggunakan gema, yang akan melakukan pekerjaan itu.

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

Anda tidak dapat benar-benar melakukannya di PHP kecuali jika 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 buffer semua output halaman dan periksa 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?

92
Hammad Khan

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 header

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

di sini Anda tidak akan menghadapi masalah

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
?>
81
Juned Ansari

Sebagian besar jawaban ini melupakan langkah 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 punya untuk menghormati header yang halaman Anda kembali, jadi dengan header yang diabaikan, sisa halaman akan dieksekusi tanpa redirect.

52
nickf

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, mis .: .:

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

Pastikan Anda menyertakan exit() atau include die().

23
jake

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
18
Luke

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.

18
Asuquo12

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 sedang menjalankan PHP sebagai (F) CGI (perlu header Status yang telah ditetapkan sebelumnya 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 menangani masalah mendukung kode pengalihan HTTP yang berbeda (301, 302, 303 dan 307), seperti yang dibahas dalam komentar dari jawaban saya sebelumnya. Berikut uraiannya:

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

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

13
Daniel A. White
header("Location: /index.php");
exit(0);   
10
joan16v

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");

8
Vikram Pote

Ya, Anda bisa menggunakan fungsi header () ,

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

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

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

7
CasperSL

Menggunakan:

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

Ini adalah pengalihan PHP biasa dan normal, tetapi Anda dapat membuat halaman pengalihan 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.
?>
7
Obaidul Haque

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

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

Dalam hal ini, mypage.php adalah 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)

Relatif/Jalur Mutlak

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 adalah pengalihan permanen (Status: 301 Dipindahkan Secara Permanen). Jadi, jika Anda mengetik URL pertama ke Google, Anda akan secara otomatis dialihkan ke tautan kedua yang diarahkan.

Interpretasi dari PHP Kode

Kode PHP yang berada setelah header () 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 fungsi header() fungsi exit() untuk mengurangi beban server:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>
7
Star

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 halaman indeks sebagai halaman arahan ulang, dan bukan halaman arahan/halaman utama.

Oleh karena itu akan mempengaruhi pengaturan SEO situs web.

6
Bhaskar Pramanik

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

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

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

6
Henrik Paul

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 tetap melanjutkan ke halaman saat ini, sehingga Anda harus mati () setelah Anda mengirimnya.

6
Brent

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

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

Pastikan tidak ada kode yang akan bekerja 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).

5
sabuz

anda dapat menggunakan kode ini untuk mengalihkan dari satu halaman ke halaman lainnya

header("Location: index.php");

atau jika Anda mencoba mengalihkan menggunakan JavaScript di php kemudian gunakan tag skrip untuk mengarahkan ulang

echo "<script>window.open('your path where you redirect ','_self')</script>";
5
Kashif

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");
?>
4

untuk mengalihkan penggunaan kode ini

header("Location: http://www.example.com/blog");
4
user8031209

Kita dapat melakukannya dengan dua cara:

  1. Ketika pengguna datang pada https://bskud.com/PINCODE/BIHAR/index.php lalu 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 di 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>";
        }
    ?>
    
3
Kavita Sharma

Ada dua cara untuk pengalihan

Menggunakan PHP

<?php 

header("Location: http://example.com/page.php");
die();
?>

Menggunakan Jquery

2
Javed Khan

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>";
   ?>
2
Shaan Ansari

Menggunakan:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>

Anda dapat mencoba menggunakan fungsi PHP header 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();
1
Doruk Ayar

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

Redirect 301 / http://new-site.com/
1
jabko87

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

Pada dasarnya

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

Jika Anda ingin meningkatkannya, sebaiknya gunakan 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.

Di 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.php atau 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;

1
Pyr James

menggunakan kode ini untuk pengalihan yang lebih baik:

$ref="http://www.example.com';
echo '<script>window.location = "'.$ref.'";</script>';  
exit;
0
user8031209