Apakah mungkin untuk mengarahkan pengguna ke halaman yang berbeda melalui penggunaan PHP?
Dikatakan pengguna pergi ke www.example.com/page.php
dan aku ingin mengarahkan mereka untuk www.example.com/index.php
, bagaimana aku akan melakukannya tanpa menggunakan meta refresh? Apakah itu mungkin?
Ini bahkan bisa melindungi halaman dari pengguna yang tidak sah.
Ringkasan ada jawaban plus saya sendiri dua sen:
Anda dapat menggunakan header()
fungsi untuk mengirim baru HTTP header, tapi ini harus dikirim ke browser sebelum HTML atau teks (jadi sebelum <!DOCTYPE ...>
deklarasi, misalnya).
header('Location: '.$newURL);
die() atau exit()
header("Location: http://example.com/myOtherPage.php");
die();
Mengapa anda harus menggunakan die()
atau exit()
: Harian WTF
URL absolut atau relatif
Sejak juni 2014 absolut maupun relatif Url yang dapat digunakan. Lihat RFC 7231 yang telah menggantikan yang lama RFC 2616, di mana hanya absolute Url yang diperbolehkan.
Kode Status
PHP's "Lokasi"-header masih menggunakan HTTP 302-redirect code, tapi ini bukan salah satu yang anda harus menggunakan. Anda harus mempertimbangkan baik 301 (permanent redirect) atau 303 (lainnya).
Catatan: W3C menyebutkan bahwa 303-header ini tidak sesuai dengan "banyak pra-HTTP/1.1 agen pengguna. Saat ini browser yang digunakan semua adalah HTTP/1.1 agen pengguna. Hal ini tidak berlaku untuk banyak pengguna lainnya agen seperti laba-laba dan robot.
Header HTTP dan header()
fungsi dalam PHP
Anda dapat menggunakan metode alternatif http_redirect($url);
yang membutuhkan PECL paket pecl yang akan diinstal.
Fungsi ini doesn't menggabungkan 303 status kode:
function Redirect($url, $permanent = false)
{
header('Location: ' . $url, true, $permanent ? 301 : 302);
exit();
}
Redirect('http://example.com/', false);
Ini adalah lebih fleksibel:
function redirect($url, $statusCode = 303)
{
header('Location: ' . $url, true, $statusCode);
die();
}
Seperti disebutkan header()
pengalihan hanya bekerja sebelum apa-apa yang ditulis. Mereka biasanya gagal jika dipanggil inmidst HTML output. Maka anda mungkin menggunakan HTML header pemecahan masalah (sangat tidak profesional!) seperti:
<meta http-equiv="refresh" content="0;url=finalpage.html">
Atau JavaScript redirect bahkan.
window.location.replace("http://example.com/");
Gunakan header()
fungsi untuk mengirim HTTP Lokasi
header:
header('Location: '.$newURL);
Bertentangan dengan apa yang beberapa orang berpikir, die()
tidak ada hubungannya dengan pengalihan. Menggunakannya hanya jika anda ingin mengarahkan bukan 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:
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 aktual. Ini tidak ada hubungannya dengan klien "menghormati" Location:
header. Mengirimkan header tidak menghentikan eksekusi PHP, terlepas dari klien yang digunakan.
function Redirect($url, $permanent = false)
{
if (headers_sent() === false)
{
header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
}
exit();
}
Redirect('http://www.google.com/', false);
Don't lupa untuk die () keluar()!
Output JavaScript dari PHP dengan menggunakan echo, yang akan melakukan pekerjaan.
echo '<script type="text/javascript">
window.location = "http://www.google.com/"
</script>';
Anda dapat't benar-benar melakukannya di PHP kecuali anda buffer output halaman dan kemudian memeriksa untuk mengarahkan kondisi. Yang mungkin terlalu banyak kerumitan. Ingat bahwa judul adalah hal pertama yang dikirimkan dari halaman. Sebagian besar mengarahkan biasanya diperlukan kemudian di halaman. Untuk itu anda harus buffer semua output dari halaman dan memeriksa untuk mengarahkan kondisi nanti. Pada saat itu anda dapat mengarahkan pengguna halaman header() atau hanya echo buffered output.
Untuk lebih lanjut tentang buffering (keuntungan)
https://stackoverflow.com/questions/2832010/what-is-output-buffering
1. Menggunakan header fungsi dengan
exit()
<?php
header('Location: target-page.php');
exit();
?>
tetapi jika anda menggunakan header fungsi kemudian beberapa kali anda akan mendapatkan "peringatan
seperti header sudah kirim" untuk mengatasi yang tidak echo atau print sebelum mengirim header atau anda hanya dapat menggunakan die()
atau exit()
setelah header fungsi.
2. Tanpa header
<?php
echo "<script>location.href='target-page.php';</script>";
?>
di sini anda tidak akan menghadapi masalah
3. Menggunakan header fungsi 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
?>
Sebagian besar dari jawaban-jawaban ini melupakan sangat langkah penting!
header("Location: myOtherPage.php");
die();
Meninggalkan yang penting kedua garis luar mungkin melihat anda berakhir pada Harian WTF. Masalahnya adalah bahwa browser tidak memiliki untuk menghormati header yang halaman anda kembali, jadi dengan header diabaikan, sisa halaman akan dieksekusi tanpa mengarahkan.
Gunakan:
<?php header('Location: another-php-file.php'); exit(); ?>
Atau jika anda telah 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 menyertakan exit()
atau seperti mati()
.
Ada dua cara untuk pengalihan
Menggunakan PHP
<?php
header("Location: http://example.com/page.php");
die();
?>
Menggunakan Jquery ``
<script>$(document).ready(function(){ lokasi hotel ini.href = 'http://example.com/page.php'; });
</script> ``Banyak jawaban yang benar, tetapi mereka menganggap anda memiliki URL absolut, yang tidak mungkin terjadi. Jika anda ingin menggunakan URL relatif dan menghasilkan sisa, 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
Anda dapat menggunakan variabel sesi untuk mengontrol akses ke halaman dan otorisasi pengguna yang sah serta:
<?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 cyber dan memutuskan, saya perlu tahu pengguna mencoba untuk mengakses Admin Panel cipta atau bagian dari Aplikasi web.
Jadi, saya menambahkan log akses untuk alamat IP dan pengguna sesi dalam sebuah file teks, karena aku don't ingin repot-repot database saya.
I've sudah menjawab pertanyaan ini, tapi aku'll melakukannya lagi sejak dalam sementara aku've belajar bahwa ada kasus-kasus khusus jika anda're berjalan di CLI (pengalihan tidak boleh terjadi dan dengan demikian seharusnya't exit()
) atau jika webserver anda menjalankan PHP sebagai (F)CGI (perlu ditetapkan sebelumnya Status
header untuk benar redirect).
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();
}
}
I've juga menangani masalah pendukung yang berbeda HTTP pengalihan kode (301
, 302
, 303
dan 307
), seperti yang dibahas dalam komentar-komentar dari jawaban saya sebelumnya. Berikut ini adalah deskripsi:
anda dapat menggunakan kode ini redirect dari satu halaman ke halaman lain
header("Location: index.php");
atau jika anda mencoba untuk redirect menggunakan JavaScript di php kemudian menggunakan tag script untuk mengarahkan
echo "<script>window.open('your path where you redirect ','_self')</script>";
Gunakan:
<?php
header('Location: redirectpage.php');
header('Location: redirectpage.php');
exit();
echo "<script>location.href='redirectpage.php';</script>";
?>
Ini adalah hal yang biasa dan normal PHP redirect, tapi anda dapat membuat halaman mengarahkan 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.
?>
Anda dapat menggunakan beberapa metode JavaScript seperti di bawah ini
diri.lokasi="http://www.example.com/index.php";
jendela.lokasi hotel ini.href="http://www.example.com/index.php";
dokumen.lokasi hotel ini.href = 'http://www.example.com/index.php';
jendela.lokasi hotel ini.mengganti("http://www.example.com/index.php");
Ya, anda dapat menggunakan header() fungsi,
header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */
exit();
Dan juga praktek terbaik adalah untuk memanggil exit() fungsi tepat setelah header()
fungsi untuk menghindari eksekusi kode di bawah ini.
Menurut dokumentasi, `header () harus dipanggil sebelum ada output aktual dikirim.
Di malam semantic web, kebenaran adalah sesuatu untuk mempertimbangkan. Sayangnya, PHP's "Lokasi"-header masih menggunakan HTTP 302-redirect code, yang, ketat, isn't yang terbaik untuk pengalihan. Satu hal yang harus menggunakan bukan, adalah 303 satu.
W3C adalah jenis cukup untuk lagi bahwa 303-header ini tidak sesuai dengan "banyak pra-HTTP/1.1 agen pengguna," yang akan berjumlah tidak ada browser yang digunakan saat ini. Jadi, 302 adalah peninggalan, yang shouldn't yang akan digunakan.
...atau anda bisa abaikan saja, seperti orang lain...
Untuk mengarahkan pengunjung ke halaman lain (terutama berguna dalam conditional loop), cukup menggunakan kode berikut:
<?php
header('Location: mypage.php');
?>
Dalam hal ini, mypage.php
adalah alamat halaman yang anda ingin mengarahkan pengunjung. Alamat ini dapat menjadi mutlak dan juga dapat mencakup parameter dalam format ini: mypage.php?param1=val1&m2=val2)
Relatif/Absolut
Ketika berhadapan dengan relatif atau absolute path, sangat ideal untuk memilih path absolut dari root server (DOCUMENT_ROOT). Gunakan format berikut:
<?php
header('Location: /directory/mypage.php');
?>
Jika sebelumnya target halaman pada server lain, anda mencantumkan URL lengkap:
<?php
header('Location: http://www.ccm.net/forum/');
?>
HTTP Header
Menurut protokol HTTP, HTTP header yang harus dikirim sebelum
jenis konten. Ini berarti bahwa karakter tidak pernah harus dikirim sebelum header — tidak bahkan ruang kosong!
Sementara/Permanen Pengalihan
Secara default, jenis pengalihan yang disajikan di atas adalah sementara. Ini berarti bahwa mesin pencari, seperti Google Search, tidak akan mengambil pengalihan ke account user ketika pengindeksan.
Jika anda ingin untuk memberitahu mesin pencari bahwa halaman telah secara permanen pindah 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 pada link di atas, anda secara otomatis diarahkan ke halaman ini. Selain itu, pengalihan permanen (Status: 301 Dipindahkan secara Permanen). Jadi, jika anda ketik URL ke Google, secara otomatis anda akan diarahkan ke kedua, diarahkan link.
Interpretasi Kode PHP
Kode PHP yang terletak setelah header() akan ditafsirkan oleh server, bahkan jika pengunjung bergerak ke alamat yang ditentukan dalam pengalihan. Dalam kebanyakan kasus, ini berarti bahwa anda perlu sebuah metode untuk mengikuti header()
fungsi exit()
fungsi dalam rangka untuk mengurangi beban server:
<?
header('Status: 301 Moved Permanently', false, 301);
header('Location: address');
exit();
?>
Seperti orang lain di sini mengatakan, mengirim lokasi header dengan:
header( "Location: http://www.mywebsite.com/otherpage.php" );
tapi anda harus melakukannya sebelum anda've dikirim lain output ke browser.
Juga, jika anda're akan menggunakan ini untuk memblokir un-otentikasi pengguna dari halaman tertentu, seperti yang anda sebutkan, perlu diingat bahwa beberapa pengguna agen akan mengabaikan ini dan lanjutkan pada halaman saat ini, jadi anda'll perlu die() setelah anda mengirimkannya.