Jak zrobić przekierowanie w PHP?

1261

Czy można przekierować użytkownika na inną stronę za pomocą PHP?

Powiedz, że użytkownik idzie www.example.com/page.phpi chcę go przekierować www.example.com/index.php, jak miałbym to zrobić bez użycia odświeżania meta? Czy to możliwe?

Może to nawet chronić moje strony przed nieautoryzowanymi użytkownikami.

Sam
źródło
Możesz zaktualizować nagłówek w PHP: nagłówek
Zack Marrapese 20.04.2009
11
@Sam: podobnie jak węzeł boczny, nie implementuj żadnego rodzaju protection from unauthorized userspoprzez przekierowanie; nie tak należy to robić;)
Strae
7
@Strae Co jest złego w ochronie stron za pomocą przekierowań? Więc jaki jest najlepszy sposób?
6
Przekierowanie @PravindaAmarathunga jest jednym z elementów, ale nie jedynym. Tylko upewnij się, że chronione elementy w ogóle nie są generowane dla nieautoryzowanych użytkowników; Przekierowanie przeglądarki można wyłączyć po stronie klienta, na przykład: jeśli przeglądarka nie przekierowuje, a strona oryginalna zostanie wyświetlona normalnie, co zobaczy użytkownik? CMS zwykle dokonuje przekierowania i nie drukuje zabezpieczonych elementów, zastępując normalne wyjście wiadomością grzecznościową.
Strae
@PravindaAmarathunga sprawdź link z odpowiedzi Markusa
Strae

Odpowiedzi:

1696

Podsumowanie istniejących odpowiedzi plus moje dwa centy:

1. Podstawowa odpowiedź

Możesz użyć tej header()funkcji do wysłania nowego nagłówka HTTP, ale musi on zostać przesłany do przeglądarki przed jakimkolwiek kodem HTML lub tekstem ( <!DOCTYPE ...>na przykład przed deklaracją).

header('Location: '.$newURL);

2. Ważne szczegóły

die () lub exit ()

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

Dlaczego warto używać die()lub exit(): The Daily WTF

Bezwzględny lub względny adres URL

Od czerwca 2014 r. Można używać zarówno bezwzględnych, jak i względnych adresów URL. Zobacz RFC 7231, który zastąpił stary RFC 2616 , gdzie dozwolone były tylko bezwzględne adresy URL.

Kody stanu

Nagłówek „Lokalizacja” PHP nadal używa kodu przekierowującego HTTP 302 , ale nie należy go używać. Należy rozważyć 301 (stałe przekierowanie) lub 303 (inne).

Uwaga: W3C wspomina, że nagłówek 303 jest niezgodny z „wieloma klientami użytkownika wcześniejszymi niż HTTP / 1.1. Obecnie wszystkie przeglądarki są klientami HTTP / 1.1. Nie dotyczy to wielu innych programów użytkownika, takich jak pająki i roboty.

3. Dokumentacja

Nagłówki HTTP i header()funkcja w PHP

4. Alternatywy

Możesz użyć alternatywnej metody, http_redirect($url);która wymaga zainstalowania pakietu PECL pakietu PECL .

5. Funkcje pomocnicze

Ta funkcja nie zawiera kodu stanu 303:

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

    exit();
}

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

Jest to bardziej elastyczne:

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

6. Obejście problemu

Jak wspomniano, header()przekierowania działają tylko zanim cokolwiek zostanie zapisane. Zwykle zawodzą, jeśli zostaną wywołane w środku HTML . Następnie możesz zastosować obejście nagłówka HTML (niezbyt profesjonalne!), Takie jak:

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

Lub nawet przekierowanie JavaScript.

window.location.replace("http://example.com/");
markus
źródło
5
Niektóre problemy z tą odpowiedzią: 303 może nie być „poprawnym” kodem stanu. 301 może być na przykład pożądany dla Google. Po drugie, header('Location: '.$newURL);musi być zanim jakiś HTML (lub tekst) zostanie przesłany do przeglądarki, inaczej nie będzie działać poprawnie.
Chuck Le Butt
6
Niestety, codzienna historia WTF jest powszechna. W każdym razie przyczyną problemu jest brak zaginięcia, ale zły projekt. Gwałtowne zamknięcie procesu jest nieprawidłowe w 99,9% przypadków. Typowym, czystszym rozwiązaniem (i tak nie jest moim ulubionym) jest zgłoszenie wyjątku RedirectionException i złapanie go w punkcie wejścia aplikacji. Następnie możesz wykonywać wszystkie połączenia „po *” (logi / zamykanie połączeń / cokolwiek
innego
4
Nie http-equiv="Location"jest obsługiwany przez wszystkie przeglądarki. Zamiast tego powinieneś użyć refresh! <meta http-equiv="refresh" content="0;url=http://example.com/">
Timo002,
71
Nigdy nie wydawaj 301, chyba że masz na myśli . 301 oznacza stały, a stały oznacza stały , co , że będzie przechowywany w pamięci podręcznej przez agentów użytkownika, co oznacza długie, pełne kofeiny noce wpatrujące się w dzienniki aplikacji, zastanawiając się, czy oszalejesz, ponieważ przysięgasz, że jakaś strona powinna zostać wywołana lub zaktualizowana i przysięgasz na Boga działa na twoim komputerze, ale nie na kliencie. Jeśli absolutnie musisz zadzwonić na numer 301, ustaw maksymalny wiek kontroli pamięci podręcznej na zasobie. Nie masz nieskończonej mądrości i nie powinieneś zachowywać się tak jak ty.
madumlao,
2
Ale czy istnieje powód, aby używać die nad wyjściem? wyjście wydaje się czystsze i bardziej odpowiednie.
ars265
122

Użyj header()funkcji, aby wysłać nagłówek HTTPLocation :

header('Location: '.$newURL);

W przeciwieństwie do tego, co myślą niektórzy, die()nie ma to nic wspólnego z przekierowaniem. Używaj go tylko wtedy, gdy chcesz przekierować zamiast normalnego wykonania.

Plik example.php :

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

Wynik trzech egzekucji:

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

Wznawianie - obowiązkowe die() / exit()to jakaś miejska legenda, która nie ma nic wspólnego z rzeczywistym PHP. Nie ma to nic wspólnego z „respektowaniem” Location:nagłówka przez klienta . Wysłanie nagłówka nie zatrzymuje wykonywania PHP, niezależnie od używanego klienta.

vartec
źródło
8
die () lub exit () jest dla klientów, którzy nie przestrzegają nagłówka „Lokalizacja: ...”
clawr 21.04.2009
12
@clawr: Nie, exit()ma zapobiec wyświetlaniu przez stronę pozostałej zawartości (pomyśl o ograniczonych stronach). vartec ma rację, nie ma to nic wspólnego z nagłówkiem lokalizacji HTTP i nie musisz tego robić exit. Postanowiłem uwzględnić to w mojej odpowiedzi, ponieważ dla kogoś, kto nie wie, jak wykonać proste przekierowanie, równie dobrze można grać bezpiecznie, a nie wdrażać prostego, ale kluczowego kroku, aby mógł skorzystać z zaawansowanego procesu kontrola.
Alix Axel
1
Ale przeglądarki, które przestrzegają nagłówka, opuszczą stronę i zamkną połączenie, gdy skrypt nadal działa. To jest całkowicie złe. PHP będzie trwać przez jakiś czas ze skryptem (dlatego kod się uruchamia), ale może go przerywać losowo w trakcie wykonywania, powodując uszkodzenie elementów. Wywołanie ignore_user_abort () zapobiegnie temu, ale szczerze, nie jest tego warte. Po prostu kontynuuj pisanie HTML (choć prawdopodobnie bezużyteczne), ale nie rób rzeczy, które zapisują się na dysku lub bazie danych po nagłówku („Lokalizacja:”); Zapisz na dysk przed przekierowaniem, jeśli to możliwe. [Również: adres URL powinien być bezwzględny.]
FrancescoMM
czy jest jakiś sposób na przekierowanie, zanim przeglądarka wykryje protokół HTTP? powodem, dla którego muszę przekierować, jest to, że nie mogę uzyskać wystarczającej liczby certyfikatów SSL dla wszystkich moich domen. użyłbym .htaccessdo przekierowania, ale potrzebuję sposobu, aby jakoś przekazać domenę przekierowaną do końcowej domeny?
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);

Nie zapomnij umrzeć () / exit ()!

Alix Axel
źródło
6
I nie zapomnij buforować danych wyjściowych, w przeciwnym razie skończysz na „Nagłówkach już wysłanych”.
Kuroki Kaze,
8
... i nie zapomnij wydrukować czegoś takiego jak „zostaniesz przekierowany na $ nepage za $ n sekund, kliknij $ link tutaj, jeśli przekierowanie nie nastąpi” Niektóre broser i niektóre ustawienia przeglądarki mogą nie przekierować.
Strae,
3
@DaNieL: ten typ przekierowania nie zajmie „$ n sekund”. Będzie to natychmiastowe, jeśli tak się stanie, i każda zgodna przeglądarka powinna to obsłużyć. Myślę, że myślisz o przekierowaniach typu „meta refresh”, których ludzie używają, gdy nie wiedzą nic lepszego.
rmeador,
1
@rmeador ... Dla starszych przeglądarek i przeglądarek specjalistycznych. Najpierw wykonaj nagłówek lokalizacji, jeśli nie uda się mieć meta-przekierowanie z „zostaniesz przekierowany na stronę za x sekund” z linkiem na wypadek, gdyby meta-przekierowanie nie powiodło się. To właściwy i bezpieczny sposób na przekierowanie.
Andrew Moore,
3
Andrew: jak przeglądarka HTTP może nie respektować Lokalizacja :?
vartec
102

Wyjście JavaScript z PHP za pomocą echa, które wykona zadanie.

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

Naprawdę nie możesz tego zrobić w PHP, chyba że buforujesz dane wyjściowe strony, a następnie nie sprawdzasz warunku przekierowania. To może być zbyt kłopotliwe. Pamiętaj, że nagłówki są pierwszą rzeczą wysyłaną ze strony. Większość przekierowań jest zwykle wymagana później na stronie. W tym celu musisz buforować wszystkie dane wyjściowe strony i później sprawdzić stan przekierowania. W tym momencie możesz przekierować nagłówek użytkownika strony () lub po prostu powtórzyć buforowane wyjście.

Więcej informacji o buforowaniu (zalety)

Co to jest buforowanie wyjściowe?

Hammad Khan
źródło
2
Prosta i konkretna odpowiedź! Idealne do prostego przekierowania strony!
Stathis Andronikos
W ten sposób nie napotykasz typowego Cannot modify header information - headers already sent bybłędu.
Kai Noack,
1
@hmd, co zrobić, jeśli javascript jest wyłączony?
Istiaque Ahmed,
@IstiaqueAhmed javascript jest obecnie prawie zawsze włączony, ale jeśli jest wyłączony, możesz użyć bufora PHP. To SO pytanie odpowiada na to. Jeśli używasz buforowania PHP, nie potrzebujesz tej metody.
Hammad Khan,
Fałsz, możesz (i powinieneś) to zrobić w PHP nawet bez buforowania: na dobrze zaprojektowanej stronie wszystkie odpowiednie przetwarzanie PHP powinno odbywać się przed wysłaniem treści HTML do użytkownika. W ten sposób przekierowania PHP będą działać poprawnie.
MestreLion
91

1. Używanie funkcji nagłówka z exit()

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

ale jeśli użyjesz funkcji nagłówka, czasami pojawi się komunikat „ostrzeżenie, jak nagłówek już wysłany”, aby rozwiązać problem, że nie odbijają echa ani nie drukują przed wysłaniem nagłówków, albo możesz po prostu użyć die()lub exit()po funkcji nagłówka.

2. Bez nagłówka

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

tutaj nie napotkasz żadnego problemu

3. Używanie funkcji nagłówka za pomocą ob_start()iob_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
?>
Juned Ansari
źródło
Pracuj jak urok. Używam <? Php echo "<script> location.href = ' google.fr /'; </script >"; ?> Aby to przetestować, i zrobił to, co chciałem
DoctorDroid Haiti
1
Drugie rozwiązanie nie będzie działać z wyłączonym JS.
Tajni
55

Większość z tych odpowiedzi zapomina o bardzo ważnym kroku!

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

Pozostawienie tak ważnej drugiej linii może spowodować, że skończysz w The Daily WTF . Problem polega na tym, że przeglądarki nie muszą szanować nagłówków zwracanych przez stronę, więc ignorowanie nagłówków spowoduje, że reszta strony zostanie wykonana bez przekierowania.

pseudonim
źródło
1
Co powiesz na przekazanie użytkownikowi danych wyjściowych przed zabiciem skryptu? Wiesz, ludzie uwielbiają wiedzieć, co się dzieje ...
Strae,
3
zakładasz, że skrypt nie ma nic innego, jak przekierowanie. Co może wcale nie być prawdą.
vartec 20.04.2009
13
@DaNieL: zmień to na śmierć („Przestań ignorować moje nagłówki!”)
nickf
3
Podobało mi się to proste wyjaśnienie, die();które podałeś - jeśli tego nie zrobisz, użytkownik może na chwilę zobaczyć całą stronę, jeśli z niej skorzystasz; użytkownik zostanie przekierowany i żadna tymczasowa usterka treści nie wyświetli + 1
TheBlackBenzKid
Po wysłaniu nagłówka może wystąpić użyteczna aktywność, która nie wysyła niczego do przeglądarki, ale rejestruje aktywność lub kończy rejestrowanie transakcji. Z tego powodu potrzeba die / exit zależy od skryptu.
DanAllen
28

Posługiwać się:

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

Lub jeśli już otworzyłeś tagi PHP, użyj tego:

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

Możesz także przekierowywać na strony zewnętrzne, np .:

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

Pamiętaj, aby dołączyć exit()lub dołączyć die().

jake
źródło
25

Możesz użyć zmiennych sesji, aby kontrolować dostęp do stron i autoryzować również prawidłowych użytkowników:

<?php
    session_start();

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

    // Page goes here
?>

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

Niedawno dostałem cyberataki i zdecydowałem, że muszę znać użytkowników próbujących uzyskać dostęp do panelu administracyjnego lub zarezerwowanej części aplikacji internetowej.

Dodałem więc dostęp do dziennika dla adresu IP i sesji użytkownika w pliku tekstowym, ponieważ nie chcę zawracać głowy mojej bazie danych.

Asuquo12
źródło
19

Wiele z tych odpowiedzi jest poprawnych, ale zakładają, że masz bezwzględny adres URL, co może nie być prawdą. Jeśli chcesz użyć względnego adresu URL i wygenerować resztę, możesz zrobić coś takiego ...

$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
Łukasz
źródło
16

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

Daniel A. White
źródło
czy jest jakiś sposób na przekierowanie, zanim przeglądarka wykryje protokół HTTP? powodem, dla którego muszę przekierować, jest to, że nie mogę uzyskać wystarczającej liczby certyfikatów SSL dla wszystkich moich domen. użyłbym .htaccessdo przekierowania, ale potrzebuję sposobu, aby jakoś przekazać domenę przekierowaną do końcowej domeny?
oldboy
16

Użyj następującego kodu:

header("Location: /index.php");
exit(0);   
joan16v
źródło
14

Odpowiedziałem już na to pytanie, ale zrobię to jeszcze raz, ponieważ w międzyczasie dowiedziałem się, że istnieją specjalne przypadki, jeśli korzystasz z CLI (przekierowania nie mogą się zdarzyć i dlatego nie powinny exit()) lub jeśli twój serwer WWW jest uruchamianie PHP jako (F) CGI (potrzebuje Statuspoprawnie ustawionego nagłówka, aby poprawnie przekierować).

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

Ja również obsługiwane problemu obsługiwać różne kody przekierowania HTTP ( 301, 302, 303i 307), jak zostało to omówione w komentarzach mojej poprzedniej odpowiedzi. Oto opisy:

  • 301 - Przeniesiono na stałe
  • 302 - Znaleziono
  • 303 - Zobacz inne
  • 307 - Tymczasowe przekierowanie (HTTP / 1.1)
Alix Axel
źródło
11

Aby przekierować użytkownika na inną stronę (szczególnie przydatne w pętli warunkowej), wystarczy użyć następującego kodu:

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

W takim przypadku mypage.phpjest to adres strony, na którą chcesz przekierować użytkowników. Ten adres może być bezwzględny i może również zawierać parametry w tym formacie:mypage.php?param1=val1&m2=val2)

Ścieżka względna / bezwzględna

W przypadku ścieżek względnych lub bezwzględnych idealnie jest wybrać ścieżkę bezwzględną z katalogu głównego serwera (DOCUMENT_ROOT). Użyj następującego formatu:

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

Jeśli strona docelowa znajduje się na innym serwerze, dołącz pełny adres URL:

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

Nagłówki HTTP

Zgodnie z protokołem HTTP nagłówki HTTP muszą być wysyłane beforedowolnego rodzaju treści. Oznacza to, że żadne znaki nie powinny być nigdy wysyłane przed nagłówkiem - nawet puste miejsce!

Tymczasowe / stałe przekierowania

Domyślnie przedstawiony powyżej typ przekierowania jest tymczasowy. Oznacza to, że wyszukiwarki, takie jak wyszukiwarka Google, nie uwzględniają przekierowania podczas indeksowania.

Jeśli chcesz powiadomić wyszukiwarki, że strona została trwale przeniesiona do innej lokalizacji, użyj następującego kodu:

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

Na przykład ta strona ma następujący kod:

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

Po kliknięciu powyższego łącza nastąpi automatyczne przekierowanie do tej strony. Co więcej, jest to stałe przekierowanie (Status: 301 Przeniesiony na stałe). Tak więc, jeśli wpiszesz pierwszy adres URL w Google, nastąpi automatyczne przekierowanie do drugiego przekierowanego linku.

Interpretacja kodu PHP

Kod PHP umieszczony po nagłówku () zostanie zinterpretowany przez serwer, nawet jeśli użytkownik przejdzie na adres podany w przekierowaniu. W większości przypadków oznacza to, że potrzebujesz metody śledzenia header()funkcji tej exit()funkcji, aby zmniejszyć obciążenie serwera:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>
Gwiazda
źródło
Dlaczego (pod koniec drugiego akapitu)? Czy &parazamiast tego masz na myśli (więc całość czyta mypage.php?param1=val1&param2=val2))? (Encja HTML para ) to „¶” - może jakiś program zewnętrzny dokonał konwersji?).
Peter Mortensen
9

Posługiwać się:

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

Jest to zwykłe i normalne przekierowanie PHP, ale możesz utworzyć stronę przekierowującą z kilkoma sekundami oczekiwania na poniższy kod:

<?php
    header('refresh:5;url=redirectpage.php '); // Note: here 5 means 5 seconds wait for redirect.
?>
Obaidul Haque
źródło
7

W przeddzień sieci semantycznej należy wziąć pod uwagę poprawność. Niestety nagłówek PHP „Lokalizacja” nadal używa kodu przekierowania HTTP 302 , który, ściśle, nie jest najlepszy do przekierowania. Tym, którego powinien użyć, jest 303 .

W3C jest na tyle uprzejmy, że wspomina, że nagłówek 303 jest niezgodny z „wieloma klientami użytkownika wcześniejszymi niż HTTP / 1.1”, co oznaczałoby brak przeglądarki w bieżącym użyciu. 302 jest więc reliktem, którego nie należy używać.

... lub możesz to zignorować, jak wszyscy inni ...

Henrik Paul
źródło
7

Możesz użyć niektórych metod JavaScript, takich jak poniżej

  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
źródło
JavaScript działa na kliencie, który może, ale nie musi być tym, czego szukasz.
chharvey
7

Tak, możesz użyć funkcji header () ,

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

A najlepszą praktyką jest wywoływanie funkcji exit () zaraz poheader() funkcji, aby uniknąć wykonania poniższego kodu.

Zgodnie z dokumentacją header()należy wywołać przed wysłaniem rzeczywistych danych wyjściowych.

Kacper
źródło
6

Jak powiedzieli inni tutaj, wysyłając nagłówek lokalizacji z:

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

ale musisz to zrobić, zanim prześlesz jakiekolwiek inne dane wyjściowe do przeglądarki.

Ponadto, jeśli zamierzasz użyć tego do blokowania nieautoryzowanych użytkowników na niektórych stronach, tak jak wspomniałeś, pamiętaj, że niektóre aplikacje klienckie zignorują to i będą kontynuować na bieżącej stronie, więc musisz umrzeć ( ) po wysłaniu.

Brent
źródło
but you need to do it before you've sent any other output to the browser. Niesamowite!! Szukałem minut, dlaczego otrzymywałem błąd, który już wysłałem. +1 !!
josh
Mówiąc bardziej ogólnie, masz / całkowicie zatrzymałeś skrypt /. die()jest tylko jednym ze sposobów, aby to zrobić.
MauganRa,
6

Oto moje przemyślenia:

IMHO, najlepszym sposobem na przekierowanie przychodzącego żądania byłoby użycie nagłówków lokalizacji

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

Po wykonaniu tej instrukcji i wysłaniu danych wyjściowych przeglądarka zacznie przekierowywać użytkownika. Upewnij się jednak, że przed wysłaniem nagłówków nie było żadnych danych wyjściowych (echo / var_dump), w przeciwnym razie doprowadzi to do błędów.

Chociaż jest to szybki i brudny sposób na osiągnięcie tego, o co pierwotnie pytano, ostatecznie okaże się katastrofą SEO, ponieważ tego rodzaju przekierowanie jest zawsze interpretowane jako przekierowanie 301/302, dlatego wyszukiwarki zawsze zobaczą twoje strona indeksu jako strona przekierowana, a nie strona docelowa / strona główna.

Wpłynie to na ustawienia SEO witryny.

Bhaskar Pramanik
źródło
1
exit () powinno być użyte natychmiast po nagłówku ()
EKanadily
@docesam .. uzgodniono .. exit () należy natychmiast wywołać po wywołaniu header (). Jednak wydaje mi się, że jeśli po tej instrukcji header () nie będzie już żadnych danych wyjściowych do przeglądarki,
funkcja
tak, ale musisz to wyjaśnić, ponieważ ktoś może skopiować linię kodu do swojego skryptu, co może potencjalnie powodować długi czas kręcenia się wokół siebie, zastanawiając się, co poszło nie tak.
EKanadily
1
@BhaskarPramanik wyobraź sobie, że musisz szybko zamknąć drzwi, ale potem musisz je ponownie pociągnąć / popchnąć / rozbić, aby upewnić się, że są już zamknięte, czy nie ...
aswzen
5

Najlepszym sposobem przekierowania za pomocą PHP jest następujący kod ...

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

Upewnij się, że po tym kod nie będzie działał

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

Cały kod musi zostać wykonany przed powyższą linią.

Przypuszczać,

Przypadek 1:

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

Przekieruje poprawnie do lokalizacji (index.php).

Przypadek 2:

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

Powyższy kod nie przekieruje do lokalizacji (index.php).

Sabuz
źródło
Istnieje już odpowiedź, która ma 1085, która zawiera informacje, które podajesz, oraz wiele więcej.
Patrick Hund,
5

Tak, można używać PHP. Przekierujemy na inną stronę.

Wypróbuj następujący kod:

<?php
    header("Location:./"); // Redirect to index file
    header("Location:index.php"); // Redirect to index file
    header("Location:example.php");
?>
Bhargav Chudasama
źródło
4

1. Korzystanie headerz wbudowanej funkcji PHP

a) Proste przekierowanie bez parametrów

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

b) Przekieruj z parametrami GET

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

2. Przekieruj za pomocą JavaScript w PHP

a) Proste przekierowanie bez parametrów

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

b) Przekieruj z parametrami GET

<?php
     $id = 2;
     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";
   ?>
Shaan Ansari
źródło
Bit javascript był jakoś jedyną rzeczą, która działała w końcowym hostingu strony; Wierzę, że to kwestia buforowania, ale rozwiązałem to od razu.
cdsaenz
3

Możemy to zrobić na dwa sposoby:

  1. Gdy użytkownik wejdzie na https://bskud.com/PINCODE/BIHAR/index.php, przekieruj na https://bskud.com/PINCODE/BIHAR.php

    Przez poniższy kod PHP

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

    Zapisz powyższy kod w https://bskud.com/PINCODE/BIHAR/index.php

  2. Jeśli dowolny warunek jest spełniony, przekieruj na inną stronę:

    <?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
źródło
Co to jest? Proszę nie używać linków do własnej strony internetowej. Drugi przykład wykorzystuje przekierowanie javascript, a nie funkcję PHP header().
Scriptman,
2

Posługiwać się:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>
Joshua Charles Pickwell
źródło
1
Czy możesz wyjaśnić funkcję swojego kodu? Twoja odpowiedź została oflagowana ze względu na jej długość i treść.
www139,
2

Można to zrobić na wiele sposobów, ale jeśli wolisz php, polecam użycie tej header()funkcji.

Gruntownie

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

Jeśli chcesz go podnieść, najlepiej użyć go w funkcjach. W ten sposób możesz dodawać do niego uwierzytelnienia i inne elementy sprawdzające.

Spróbujmy, sprawdzając poziom użytkownika.

Załóżmy zatem, że zapisałeś poziom uprawnień użytkownika w sesji o nazwie u_auth.

w 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;
        }
     }

     . . .

Następnie wywołasz funkcję dla każdej strony, którą chcesz uwierzytelnić.

Jak na page.phplub na innej stronie.

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

    . . .

Bibliografia;

Pyr James
źródło
2

Z czasem podoba mi się rodzaj przekierowania.

<?php

header("Refresh: 5;url=índex.php");
PauloBoaventura
źródło
2

Korzystanie z funkcji nagłówka do routingu

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

Załóżmy, że chcemy trasować z pliku A.php do B.php, niż musimy skorzystać z pomocy <button>lub <a>. Zobaczmy przykład

<?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
źródło
Czy możesz podać dokładne lub dobre rozwiązanie?
Mehedi Abdullah
Istnieje już wiele rozwiązań. Twoje rozwiązanie ma mieszany HTML i PHP bez tagów PHP. Po drugie nagłówek wysyłasz po wydrukowaniu kodu HTML, więc nie będzie działać. A nazwa przykładowych plików jest zła. Nie powinieneś nazywać ich A.php i B.php. Wiem, że to tylko przykład, ale nadal powinieneś dbać o konwencję nazewnictwa.
Tajni
1

Jeśli korzystasz z Apache, możesz również użyć .htaccess do przekierowania.

Redirect 301 / http://new-site.com/
michal.jakubeczy
źródło
1

Możesz spróbować użyć headerfunkcji PHP, aby wykonać przekierowanie. Będziesz chciał ustawić bufor wyjściowy, aby Twoja przeglądarka nie wyświetlała ostrzeżenia o przekierowaniu na ekran.

ob_start();
header("Location: " . $website);
ob_end_flush();
Doruk Ayar
źródło
1
exit () powinno być użyte natychmiast po nagłówku (). również buforowanie jest domyślnie automatycznie włączone przez pewien czas.
EKanadily
0

Spróbuj tego

 $url = $_SERVER['HTTP_REFERER'];
 redirect($url);
Shareque
źródło