PHP'de nasıl yeniden yönlendirme yapabilirim?


1262

PHP kullanarak bir kullanıcıyı farklı bir sayfaya yönlendirmek mümkün mü?

Diyelim ki kullanıcı gider www.example.com/page.phpve yönlendirmek istiyorum www.example.com/index.php, bunu meta yenileme kullanmadan nasıl yapabilirim? Mümkün mü?

Bu, sayfalarımı yetkisiz kullanıcılardan bile koruyabilir.


PHP'de başlığı güncelleyebilirsiniz: başlık
Zack Marrapese

11
@Sam: sadece yan düğüm olarak, yok her türlü uygulamaya protection from unauthorized usersyönlendirme üzerinden; işlerin böyle yapılması gerekmiyor;)
Strae

7
@Strae Sayfaları yönlendirme ile korumanın nesi yanlış? O zaman en iyi yol nedir?

6
@PravindaAmarathunga yönlendirmesi unsurlardan biridir, ancak tek unsur değildir. Sadece korumalı öğelerin yetkisiz kullanıcılar için hiç çıktı almadığından emin olun; Tarayıcının yönlendirmesi istemci tarafında devre dışı bırakılabilir, örneğin: tarayıcı yönlendirmeyi yapmazsa ve orijinal sayfa normal şekilde çıkarılırsa kullanıcı ne görür? CMS genellikle yönlendirmeyi yapar ve normal çıktıyı nezaket mesajıyla değiştirerek korumalı öğeleri yazdırmaz.
Strae

: Markus cevabı bağlantıyı kontrol @PravindaAmarathunga thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Strae

Yanıtlar:


1697

Mevcut cevapların ve kendi iki sentimin özeti:

1. Temel cevap

header()Yeni bir HTTP başlığı göndermek için bu işlevi kullanabilirsiniz , ancak bunun tarayıcıya herhangi bir HTML veya metinden önce gönderilmesi gerekir ( <!DOCTYPE ...>örneğin , bildirimden önce ).

header('Location: '.$newURL);

2. Önemli ayrıntılar

die () veya exit ()

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

Neden die()ya da kullanmalısınız exit(): Günlük WTF

Mutlak veya göreli URL

Haziran 2014'ten beri hem mutlak hem de göreli URL'ler kullanılabilir. Yalnızca mutlak URL'lere izin verilen eski RFC 2616'nın yerini alan RFC 7231'e bakın .

Durum Kodları

PHP'nin "Konum" başlığı hala HTTP 302 yönlendirme kodunu kullanıyor, ancak kullanmanız gereken kod bu değil. 301'i (kalıcı yönlendirme) veya 303'ü (diğer) göz önünde bulundurmalısınız .

Not: W3C , 303 başlığının "HTTP öncesi / 1.1 öncesi pek çok kullanıcı aracısıyla uyumlu olmadığını belirtir. Şu anda kullanılan tarayıcıların tümü HTTP / 1.1 kullanıcı aracılarıdır. Bu, örümcekler ve robotlar gibi diğer birçok kullanıcı aracısı için geçerli değildir.

3. Dokümantasyon

HTTP Üstbilgileri ve header()PHP'deki işlev

4. Alternatifler

PECL paketininhttp_redirect($url); kurulmasını gerektiren alternatif yöntemi kullanabilirsiniz .

5. Yardımcı İşlevleri

Bu işlev 303 durum kodunu içermez:

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

    exit();
}

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

Bu daha esnektir:

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

6. Geçici çözüm

Belirtildiği gibi header()yönlendirmeler sadece herhangi bir şey yazılmadan önce çalışır. Genellikle HTML çıkışı çağrıldığında başarısız olurlar . Ardından, aşağıdaki gibi bir HTML üstbilgisi geçici çözümü (çok profesyonel değil!) Kullanabilirsiniz:

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

Ya da bir JavaScript yönlendirmesi bile.

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

5
Bu yanıtla ilgili bazı sorunlar: 303 "doğru" durum kodu olmayabilir. Örneğin, Google için 301 istenebilir. İkinci olarak, header('Location: '.$newURL);herhangi bir HTML (veya metin) tarayıcıya geçirilmeden önce olmalıdır , aksi takdirde düzgün çalışmaz.
Chuck Le Butt

6
Günlük WTF hikayesi ne yazık ki ortak bir hikayedir. Her neyse, soruna neden olan kayıp kalıp değil, kötü bir tasarım. Vakaların% 99,9'unda süreci şiddetle kapatmak yanlıştır. Yaygın, daha temiz bir çözüm (zaten benim favorim değil), bir RedirectionException özel durumu oluşturmak ve uygulama giriş noktanızda yakalamaktır. Bundan sonra tüm "after *" çağrılarınızı (günlükler / yakın bağlantılar / ne
olursa

4
Bu http-equiv="Location", tüm tarayıcılar tarafından desteklenmez. Bunun refreshyerine kullanmalısınız ! <meta http-equiv="refresh" content="0;url=http://example.com/">
Timo002

71
Bunu demek istemedikçe asla 301 çıkarmayın . 301 kalıcı araçlar ve kalıcı bir anlamı kalıcı , uzun, yani kullanıcı aracıları tarafından önbelleğe edilecektir anlam, bazı sayfası olarak adlandırılır veya güncellenmiş ve yemin gerekirdi yemin çünkü delirerek gidiyoruz merak uygulama günlüklerinde bakarak kafein dolu geceler Tanrı'ya göre makinenizde çalışır ama müşterinin değil. Kesinlikle 301'i çağırmanız gerekiyorsa, kaynağa bir önbellek denetimi maksimum yaşı koyun. Sonsuz bir bilgeliğiniz yok ve sizin gibi davranmamalısınız.
madumlao

2
Ancak die over çıkışını kullanmak için bir neden var mı? çıkış daha temiz ve daha uygun görünüyor.
ars265

122

Bir HTTP üstbilgisi göndermek için header()işlevi kullanın :Location

header('Location: '.$newURL);

Bazılarının düşündüğünün aksine die(), yönlendirme ile ilgisi yoktur. Kullanın sadece sen yönlendirmek istiyorsanız yerine , normal yürütme.

Example.php dosyası :

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

Üç infaz sonucu:

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

Devam - zorunlu die()/ exit()gerçek PHP ile ilgisi olmayan bazı kentsel efsanedir. İstemcinin Location:başlığa "saygı duyması" ile ilgisi yoktur . Başlık göndermek, kullanılan istemciden bağımsız olarak PHP'nin yürütülmesini durdurmaz.


8
die () veya exit () "Konum: ..." başlığına saygı duymayan müşteriler içindir
clawr

12
@clawr: Hayır, exit()sayfanın kalan içeriği göstermesini engellemektir (kısıtlanmış sayfaları düşünün). vartec doğru, HTTP Konum üstbilgisi ile ilgisi yok ve yapmanız gerekmiyor exit. Cevabımı dahil etmeyi seçtim, çünkü basit bir yönlendirme yapmayı bilmeyen biri için, basit ama önemli bir adımı uygulamak yerine güvenli oynayabilir, böylece gelişmiş süreçten faydalanabilir. kontrol.
Alix Axel

1
Ancak başlığa saygı duyan tarayıcılar, komut dosyanız hala yürütülürken sayfadan ayrılacak ve bağlantıyı kapatacaktır. Bu tamamen kötü. PHP bir süre için komut dosyası ile devam edecektir (bu yüzden kodunuz yürütülür), ancak yürütme ortasında rastgele durdurabilir, şeyleri kırık bırakabilir. İgnore_user_abort () öğesini çağırmak bunu engelleyecektir, ancak içtenlikle buna değmez. HTML yazma öğelerinizle devam edin (muhtemelen işe yaramaz olsa da), ancak bir başlıktan sonra disk veya veritabanına yazan şeyler yapmayın ('Konum:'); Mümkünse yeniden yönlendirmeden önce diske yazın. [Ayrıca: url mutlak olmalıdır.]
FrancescoMM

HTTP protokolünü algılamadan önce yeniden yönlendirmenin bir yolu var mı? yönlendirmem gereken nedeni, tüm etki alanlarım için yeterli SSL sertifikası alamıyorum. .htaccessyönlendirmek için kullanmak istiyorsunuz , ama bir şekilde son etki alanına yönlendirilen etki alanı geçmek için bir yol gerekir?
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);

Ölmeyi () / çıkmayı () unutmayın!


6
Ve çıktı arabelleğe almayı unutmayın yoksa 'Başlıklar zaten gönderildi' ile sonuçlanır.
Kuroki Kaze

8
... "$ nepage'e $ n saniye içinde yönlendirileceksiniz, yönlendirme gerçekleşmezse $ link'i buraya tıklayın" gibi bir şeyi yazdırmayı unutmayın Bazı tarayıcılar ve bazı tarayıcı ayarları bu yönlendirmede başarısız olabilir.
Strae

3
@DaNieL: bu yönlendirme türü "$ n saniye" sürmez. Herhangi bir şey olursa anında olur ve uygun herhangi bir tarayıcı bunu ele almalıdır. İnsanların daha iyi bilmediklerinde kullandıkları "meta yenileme" yönlendirmelerini düşündüğünüzü düşünüyorum.
rmeador

1
@rmeador ... Eski tarayıcılar ve özel tarayıcılar için. İlk olarak Konum başlığınızı yapmanız gerekir; başarısızlık durumunda, meta yönlendirmenin başarısız olması durumunda bir bağlantıyla "x saniyede sayfaya yönlendirileceksiniz" ifadesiyle bir meta yönlendirme yapılır. Yönlendirme yapmanın uygun ve başarısız bir yolu budur.
Andrew Moore

3
Andrew: HTTP tarayıcı Konum'a nasıl saygı gösteremez :?
vartec

102

İşi yapacak yankı kullanarak PHP'den JavaScript çıktısı alın.

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

Sayfa çıktısını arabelleğe alma ve daha sonra yönlendirme koşulunu kontrol etmedikçe gerçekten PHP'de yapamazsınız. Bu çok güçlük çekebilir. Sayfalardan gönderilen ilk başlıkların başlık olduğunu unutmayın. Yönlendirmenin çoğu genellikle sayfanın ilerleyen kısımlarında gereklidir. Bunun için sayfanın tüm çıktılarını arabelleğe almanız ve daha sonra yönlendirme koşulunu kontrol etmeniz gerekir. Bu noktada, sayfa kullanıcı üstbilgisini () yönlendirebilir veya yalnızca arabelleğe alınan çıktıyı yankılayabilirsiniz.

Arabelleğe alma hakkında daha fazla bilgi için (avantajlar)

Çıktı tamponlama nedir?


2
Basit ve noktaya cevap! Basit bir sayfa yönlendirmesi için harika!
Stathis Andronikos

Ve bu şekilde ortak Cannot modify header information - headers already sent byhataya girmezsiniz.
Kai Noack

1
@hmd, javascript devre dışı bırakılırsa ne olur?
Istiaque Ahmed

@IstiaqueAhmed javascript bugünlerde neredeyse her zaman etkinleştirilir, ancak devre dışı bırakılmışsa PHP arabelleğini kullanabilirsiniz. Bu SO sorusu buna cevap veriyor. PHP Tamponlama kullanıyorsanız o zaman ben gueess bu yöntem gerekmez.
Hammad Khan

Yanlış, arabelleğe almadan bile PHP'de yapabilirsiniz (ve yapmalısınız): iyi tasarlanmış bir sayfada, kullanıcıya herhangi bir HTML içeriği gönderilmeden önce ilgili tüm PHP işlemlerinin gerçekleştirilmesi gerekir. Bu şekilde PHP yönlendirmeleri sorunsuz çalışır.
MestreLion

91

1. başlık fonksiyonu ile kullanma exit()

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

ancak üstbilgi işlevini kullanırsanız, üstbilgi göndermeden önce yankı veya yazdırma yapmamak için "üstbilgi zaten gönderilir gibi uyarı" ifadesini alırsınız die()veya exit()üstbilgi işlevini yalnızca veya sonra kullanabilirsiniz .

2. Üstbilgisiz

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

burada herhangi bir problemle karşılaşmayacaksın

3. ob_start()ve ile başlık işlevini kullanmaob_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
?>

Bir cazibe gibi çalışın. <? Php echo "<script> location.href = ' google.fr/ ' ; </script >" kullanıyorum; ?> Bunu test etmek ve istediğimi yaptım
DoctorDroid Haiti

1
İkinci çözüm JS devre dışı bırakıldığında çalışmaz.
Tajni

55

Bu cevapların çoğu çok önemli bir adımı unutuyor !

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

Bu hayati ikinci çizgiyi bırakmak, Daily WTF ile sonuçlandığınızı görebilir . Sorun tarayıcılar kalmamasıdır var senin sayfa dönüş, bu nedenle başlıkları göz ardı edilerek, sayfanın geri kalanı bir yönlendirme olmadan yürütülecek başlıkları saygı.


1
Senaryoyu öldürmeden önce kullanıcıya bazı çıktılar vermeye ne dersin? Bilirsiniz, insanlar ne olduğunu bilmek ister ...
Strae

3
betiğin yönlendirme dışında bir ilgisi olmadığını varsayıyorsunuz. Bu hiç de doğru olmayabilir.
vartec

13
@DaNieL: ölmek için değiştir ("Başlıklarımı görmezden gelmeyi bırak!")
nickf

3
die();Yaptığınız basit bir açıklamayı sevdim - eğer yapmazsanız, kullanıcı bir an için sayfayı tam olarak görebilir; kullanıcı yönlendirilecek ve hiçbir geçici içerik hatası gösterilmeyecek + 1
TheBlackBenzKid

Başlık gönderildikten, tarayıcıya hiçbir şey göndermeyen ancak etkinliği günlüğe kaydeden veya kayıt işlemlerini bitirdikten sonra yararlı bir etkinliğe sahip olmak mümkündür. Bu nedenle, die / exit ihtiyacı betiğe bağlıdır.
DanAllen

28

kullanın:

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

Veya zaten PHP etiketleri açtıysanız, şunu kullanın:

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

Harici sayfalara da yönlendirme yapabilirsiniz, örneğin:

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

Eklediğinizden exit()veya eklediğinizden emin olun die().


25

Sayfalara erişimi kontrol etmek ve geçerli kullanıcıları yetkilendirmek için oturum değişkenlerini kullanabilirsiniz:

<?php
    session_start();

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

    // Page goes here
?>

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

Son zamanlarda, siber saldırılar aldım ve karar verdim, Yönetici Paneli'ne veya web Uygulamasının ayrılmış bölümüne erişmeye çalışan kullanıcıları tanımam gerekiyordu.

Bu yüzden, bir metin dosyasında IP adresi ve kullanıcı oturumları için bir günlük erişimi ekledim, çünkü veritabanımı rahatsız etmek istemiyorum.


19

Bu yanıtların çoğu doğrudur, ancak mutlak bir URL'ye sahip olduğunuzu varsayar; bu durum böyle olmayabilir. Göreli bir URL kullanmak ve geri kalanını oluşturmak istiyorsanız, böyle bir şey yapabilirsiniz ...

$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

16

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


HTTP protokolünü algılamadan önce yeniden yönlendirmenin bir yolu var mı? yönlendirmem gereken nedeni, tüm etki alanlarım için yeterli SSL sertifikası alamıyorum. .htaccessyönlendirmek için kullanmak istiyorsunuz , ama bir şekilde son etki alanına yönlendirilen etki alanı geçmek için bir yol gerekir?
oldboy

16

Aşağıdaki kodu kullanın:

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

14

Bu soruyu zaten yanıtladım, ancak tekrar yapacağım, çünkü bu arada CLI'de çalışıyorsanız (yönlendirmeler olamaz ve bu nedenle olmamalı exit()) veya web sunucunuzda özel durumlar olduğunu öğrendim. PHP'yi (F) CGI olarak çalıştırır ( Statusdüzgün bir şekilde yönlendirmek için önceden ayarlanmış bir başlığa ihtiyaç duyar ).

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();
    }
}

Ben de farklı HTTP yönlendirmesinin kodlarını destekleyen konusunu ele ettik ( 301, 302, 303ve 307), benim önceki cevap yorumlarla ele olduğu gibi. İşte açıklamalar:

  • 301 - Kalıcı Olarak Taşındı
  • 302 - Bulundu
  • 303 - Diğerlerine Bak
  • 307 - Geçici Yeniden Yönlendirme (HTTP / 1.1)

11

Ziyaretçiyi başka bir sayfaya yönlendirmek (özellikle bir koşullu döngüde yararlıdır) için aşağıdaki kodu kullanmanız yeterlidir:

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

Bu durumda, mypage.phpziyaretçileri yeniden yönlendirmek istediğiniz sayfanın adresidir. Bu adres mutlak olabilir ve bu biçimdeki parametreleri de içerebilir:mypage.php?param1=val1&m2=val2)

Göreceli / Mutlak Yol

Göreceli veya mutlak yollarla uğraşırken, sunucunun kökünden (DOCUMENT_ROOT) mutlak bir yol seçmek idealdir. Aşağıdaki biçimi kullanın:

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

Hedef sayfa başka bir sunucuda bulunuyorsa, tam URL'yi eklersiniz:

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

HTTP Üstbilgileri

HTTP protokolüne göre, HTTP üstbilgileri gönderilmelidir before herhangi bir tür içerik . Bu, başlıktan önce hiçbir karakterin gönderilmemesi gerektiği anlamına gelir - boş bir alan bile!

Geçici / Kalıcı Yönlendirmeler

Varsayılan olarak, yukarıda sunulan yönlendirme türü geçicidir. Bu, Google Arama gibi arama motorlarının dizine eklerken yönlendirmeyi dikkate almayacağı anlamına gelir.

Arama motorlarına bir sayfanın kalıcı olarak başka bir konuma taşındığını bildirmek isterseniz, aşağıdaki kodu kullanın:

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

Örneğin, bu sayfa aşağıdaki koda sahiptir:

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

Yukarıdaki bağlantıyı tıkladığınızda, otomatik olarak bu sayfaya yönlendirilirsiniz. Dahası, kalıcı bir yeniden yönlendirmedir (Durum: 301 Kalıcı Olarak Taşındı). Dolayısıyla, ilk URL'yi Google'a yazarsanız, otomatik olarak ikinci, yeniden yönlendirilen bağlantıya yönlendirilirsiniz.

PHP Kodunun Yorumlanması

Header () öğesinden sonra bulunan PHP kodu, ziyaretçi yeniden yönlendirmede belirtilen adrese gitse bile sunucu tarafından yorumlanır. Çoğu durumda, bu , sunucunun yükünü azaltmak için işlevin header()işlevini takip etmek için bir yönteme ihtiyacınız olduğu anlamına gelir exit():

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

Neden (ikinci paragrafın sonuna yakın)? Bunun &parayerine mi demek istiyorsun (yani bütün okuyor mypage.php?param1=val1&param2=val2))? (HTML varlık para ) "¶" dir - belki de bazı harici programlar dönüşüm gerçekleştirdi?).
Peter Mortensen

9

kullanın:

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

Bu normal ve normal bir PHP yönlendirmesidir, ancak aşağıdaki kod tarafından birkaç saniye bekleyerek bir yönlendirme sayfası yapabilirsiniz:

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

7

Anlamsal ağın arifesinde, doğruluk dikkate alınması gereken bir şeydir. Ne yazık ki, PHP'nin "Konum" başlığı hala yönlendirme için en iyisi olmayan HTTP 302 yönlendirme kodunu kullanıyor . Bunun yerine kullanması gereken 303'tür .

W3C nezaketini olan söz 303-başlık Halen kullanılmakta hiçbir tarayıcıda anlamına geleceğini "çok önceden HTTP / 1.1 kullanıcı aracıları," uyumsuz olduğunu. Yani, 302 bir kalıntı, hangi olmamalı kullanılmaması .

... ya da herkes gibi görmezden gelebilirsin ...


7

Aşağıdaki gibi bazı JavaScript yöntemlerini kullanabilirsiniz

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


Javascript, aradığınız şey olabilir veya olmayabilir istemci üzerinde çalışır.
chharvey

7

Evet, header () işlevini kullanabilirsiniz,

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

Ve ayrıca en iyi uygulama, hemen çıkıştan sonra exit () işlevini çağırmaktır .header() aşağıdaki kod yürütülmesini önlemek için .

Belgelere göre, header()herhangi bir gerçek çıktı gönderilmeden önce çağrılmalıdır.


6

Buradaki diğer kullanıcıların söylediği gibi, konum başlığını şu şekilde göndererek:

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

ancak tarayıcıya başka bir çıktı göndermeden önce bunu yapmanız gerekir.

Ayrıca, kimliği doğrulanmayan kullanıcıları belirttiğiniz gibi belirli sayfalardan engellemek için bunu kullanacaksanız, bazı kullanıcı aracılarının bunu görmezden geleceğini ve yine de geçerli sayfada devam edeceğini unutmayın , bu nedenle ölmeniz gerekir ( ) gönderdikten sonra.


but you need to do it before you've sent any other output to the browser. Korku veren !! Neden zaten hata gönderdi başlıklarını almaya devam hakkında dakikalar arıyordum. +1 !!
josh

Daha genel olarak, senaryonuzu tamamen durdur / durdur. die()bunu yapmanın sadece bir yolu.
MauganRa

6

İşte düşüncelerim:

IMHO, gelen bir isteği yeniden yönlendirmenin en iyi yolu, konum üstbilgilerini kullanmaktır.

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

Bu ifade yürütüldükten ve çıktı gönderildikten sonra, tarayıcı kullanıcıyı yeniden yönlendirmeye başlar. Ancak, başlık göndermeden önce herhangi bir çıktı (herhangi bir echo / var_dump) olmadığından emin olun, aksi takdirde hatalara yol açar.

Bu, başlangıçta sorulana ulaşmak için hızlı ve kirli bir yol olsa da, bu tür bir yönlendirme her zaman 301/302 yönlendirmesi olarak yorumlandığından, bir SEO felaketi haline gelecektir, bu nedenle arama motorları her zaman dizin sayfasını yeniden yönlendirilmiş bir sayfa olarak değil, açılış sayfası / ana sayfanın bir parçası olarak değil.

Bu nedenle web sitesinin SEO ayarlarını etkileyecektir.


1
exit () başlık () 'dan hemen sonra kullanılmalıdır
EKanadily

@docesam .. agree .. exit () hemen header () çağrısından sonra çağrılmalıdır. Ancak, bu header () ifadesinden sonra tarayıcıya daha fazla çıktı yoksa, exit () gerekli olmayabilir - Sadece benim fikrim
Bhaskar Pramanik

evet ama bunu açıklamalısınız çünkü birisi kod satırınızı senaryosuna kopyalayabilir ve bu da neyin yanlış gittiğini anlamak için kendi etrafında dolaşmaya neden olabilir.
EKanadily

1
@BhaskarPramanik hızlı bir şekilde bir kapı kilitlemek zorunda hayal, ama sonra zaten kilitli olup olmadığını emin olmak için onları tekrar çekmek / itmek / parçalamak zorunda ..
aswzen

5

PHP ile yönlendirmenin en iyi yolu aşağıdaki koddur ...

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

Sonra hiçbir kod çalışmaz emin olun

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

Tüm kod yukarıdaki satırdan önce yürütülmelidir.

, varsayalım

Dava 1:

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

Konuma doğru şekilde yeniden yönlendirir (index.php).

Durum 2:

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

Yukarıdaki kod konuma yönlendirilmez (index.php).


Sağladığınız bilgileri içeren 1085'in yanı sıra çok daha fazlasına sahip bir yanıt zaten var.
Patrick Hund

5

Evet, PHP kullanmak mümkündür. Başka bir sayfaya yönlendireceğiz.

Aşağıdaki kodu deneyin:

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

4

1. kullanarak header, dahili bir PHP fonksiyonu

a) Parametresiz basit yönlendirme

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

b) GET parametreleriyle yönlendirme

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

2. PHP'de JavaScript ile yönlendirme

a) Parametresiz basit yönlendirme

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

b) GET parametreleriyle yönlendirme

<?php
     $id = 2;
     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";
   ?>

Javascript bit bir şekilde sitenin son barındırma çalışan tek şeydi; Bunun bir önbellek sorunu olduğuna inanıyorum ama bununla hemen çözdüm.
cdsaenz

3

Bunu iki şekilde yapabiliriz:

  1. Kullanıcı https://bskud.com/PINCODE/BIHAR/index.php adresine geldiğinde adresine yönlendirin https://bskud.com/PINCODE/BIHAR.php

    Aşağıdaki PHP koduna göre

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

    Yukarıdaki kodu https://bskud.com/PINCODE/BIHAR/index.php adresine kaydedin

  2. Herhangi bir koşul geçerli olduğunda başka bir sayfaya yönlendirin:

    <?php
        $myVar = "bskud";
        if ($myVar == "bskud") {
    ?>
    
    <script> window.location.href="https://bskud.com";  </script>
    
    <?php
        }
        else {
            echo "<b>Check the website name again</b>";
        }
    ?>

Bu nedir? Lütfen kendi web sitenize bağlantılar kullanmayın. İkinci örnek PHP header()işlevini değil, javascript yönlendirmesini kullanır .
Scriptman

2

kullanın:

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

1
Kodunuzun işlevini açıklayabilir misiniz? Cevabınız uzunluğu ve içeriği nedeniyle işaretlendi.
www139

2

Bunu yapmanın birden fazla yolu vardır, ancak isterseniz işlevin phpkullanılmasını öneririm header().

temel olarak

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

Bir çentik açmak istiyorsanız, en iyisi işlevlerde kullanmaktır. Bu şekilde, içine kimlik doğrulama ve diğer kontrol unsurları ekleyebilirsiniz.

Kullanıcının seviyesini kontrol ederek deneyelim.

Bu nedenle, kullanıcının yetki düzeyini adlı bir oturumda sakladığınızı varsayalım u_auth.

İçinde 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;
        }
     }

     . . .

Ardından, kimliği doğrulamak istediğiniz her sayfa için işlevi çağırırsınız.

İçinde page.phpveya başka bir sayfada olduğu gibi.

<?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”);

    . . .

Referanslar;


2

Zaman içinde yeniden yönlendirmeyi seviyorum.

<?php

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

2

Yönlendirme için başlık işlevini kullanma

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

Biz rotasına istediğinizi varsayalım A.php dosyanın B.php biz yardımını almak zorunda den <button>veya <a>. Bir örnek görelim

<?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>

Doğru çözümü veya iyi çözümü sağlayabilir misiniz?
Mehedi Abdullah

Zaten çok sayıda çözüm var. Çözümünüz HTML etiketleri ve PHP etiketleri olmadan karışık. İkincisi, html kodunu yazdırdıktan sonra başlık gönderirsiniz, bu yüzden çalışmaz. Ve örnek dosyaların adı kötü. Onlara A.php ve B.php adını vermemelisiniz. Bunun sadece örnek olduğunu biliyorum, ama yine de adlandırma kuralını önemsemelisiniz.
Tajni

1

Apache üzerinde çalışıyorsanız, yeniden yönlendirme için .htaccess kullanabilirsiniz.

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

1

Yeniden headeryönlendirme yapmak için PHP işlevini kullanmaya çalışabilirsiniz. Çıktı tamponunu tarayıcınızın ekrana bir yönlendirme uyarısı vermeyecek şekilde ayarlamak isteyeceksiniz.

ob_start();
header("Location: " . $website);
ob_end_flush();

1
exit (), başlıktan () hemen sonra kullanılmalıdır. Ayrıca dışarı tamponlama bir süredir varsayılan olarak otomatik olarak açıktır.
EKanadily

0

bunu dene

 $url = $_SERVER['HTTP_REFERER'];
 redirect($url);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.