PHP bir yönlendirme yapmak nasıl?

10 Cevap php

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

Kullanıcı www.example.com / page.php gider ve ben nasıl bir meta yenileme kullanmadan öyle yapardı, www.example.com / index.php onları yönlendirmek istiyorsanız söyleyin? Olası?

Bu bile yetkisiz kullanıcıların benim sayfaları korumak olabilir.

10 Cevap

Mevcut cevapları artı benim kendi iki kuruş Özeti:

1. Basic answer

Sen yeni bir HTTP başlığı göndermek için header () işlevini kullanabilirsiniz, ancak bu herhangi bir HTML veya metin önce tarayıcıya gönderilen (yani <!DOCTYPE ...> ilanından önce, örneğin) gerekmektedir.

header('Location: '.$newURL);

2. Important details

die()

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

Neden kullanmalıyım die(): The Daily WTF

Absolute URL

URL mutlak olması gerekir. Bkz RFC 2616. Ancak çoğu durumda göreli bir URL de kabul edilecektir.

Status Codes

PHP'nin "Yer"-header hala HTTP 302-yönlendirme kodu kullanır, ama bu kullanmanız gereken biri değil. Sen 301 (kalıcı yönlendirme) veya 303 (diğer) ya da düşünmelisiniz.

Not:.. W3C mentions 303-header çok pre-HTTP/1.1 kullanıcı ajanları "ile uyumsuz olduğunu şu anda kullanılan tarayıcıların tüm HTTP/1.1 kullanıcı ajanlar Bu örümcekler gibi diğer birçok kullanıcı aracıları için doğru değildir ve robotlar.

3. Documentation

PHP HTTP Başlıkları ve header () fonksiyonu

4. Alternatives

Sen http_redirect ($ url) alternatif yöntemi kullanabilir; ki PECL package pecl monte edilmesi gerekmektedir.

5. Helper Functions

Bu fonksiyon, 303 durum kodu dahil değildir:

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

    exit();
}

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

Bu daha esnektir:

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

6. Workaround

Şey yazılır önce belirtildiği başlık olarak () sadece iş yönlendirir. invoked inmidst HTML çıkış ise genellikle başarısız. : Sonra bir HTML başlığı geçici çözüm (! Çok profesyonel değil) gibi kullanabilirsiniz

 <meta http-equiv="Location" content="http://example.com/">

Ya da bir JavaScript hatta yönlendirmek.

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

    exit();
}

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

(() / Çıkış ölmek unutmayın!)

Bu cevapların çoğu bir very önemli adımı unutmadan!

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

Bu hayati ikinci satır Çıkış bırakarak kadar sona görebilirsiniz The Daily WTF. Sorun tarayıcılar have başlıkları göz ardı ediliyor öylesine, sayfanın geri kalanı bir yönlendirme olmadan idam edilecektir sayfasında iade, başlıklarını saygı kalmamasıdır.

Diğerleri gibi burada birlikte yer başlığını göndererek, şunları söyledi:

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

Eğer tarayıcıya başka herhangi bir çıktı yolladım ama önce bunu yapmanız gerekir.

Ayrıca, size bahsettiğim gibi, bazı sayfalardan un-doğrulanmış kullanıcıları engellemek akılda tutmak için bu kullanmak için gidiyoruz eğer bazı kullanıcı arayüzleri will ignore this ve yine geçerli sayfada devam, bu yüzden olacak Eğer gönderdikten sonra () ölmek gerekir.

Semantik web arifesinde, doğruluğu dikkate şeydir. Ne yazık ki, PHP'nin "Yer"-başlık hala kesinlikle, yönlendirme için iyi bir değil ki, HTTP 302-yönlendirme kodu kullanır. Yerine kullanmanız gereken bir, 303 biridir.

W3C nezaketini mention için 303-header mevcut kullanımda hiçbir tarayıcı anlamına geleceğini "birçok pre-HTTP/1.1 kullanıcı ajanları," ile uyumsuz olmasıdır. Yani, 302 shouldn't kullanılacak olan, bir kalıntı olduğunu.

... Ya sen de herkes gibi, bunu görmezden olabilir ...

[) (0] zaten bu soruya cevap ettik, ama bu arada ben CLI (yönlendirmeleri olamaz çalışan konum ve böylece olmamalı {if özel durumlar olduğunu öğrendim beri bunu tekrar yapacağım }) veya Web sunucusu bir (F) CGI (bunun önceden ayarlanmış bir {[(1 gerekir)] doğru yönlendirmek için} header) olarak PHP çalışıyorsa.

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 yeniden yönlendirme kodları (301, 302, 303 ve 307), bunu gibi destek konusunu ele ettik benim önceki cevap görüşleri ele alındı, burada açıklamaları:

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

Eğer php başlığı güncelleyebilirsiniz: header

Böyle olmayabilir ki, bu cevapların çoğu doğru, ama mutlak bir URL var sayıyorum. Bir relative URL kullanımı ve geri kalanı oluşturmak istiyorsanız, o zaman böyle bir şey yapabilirim ...

$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

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