Wie mache ich eine Weiterleitung in PHP?

1262

Ist es möglich, einen Benutzer mithilfe von PHP auf eine andere Seite umzuleiten?

Angenommen, der Benutzer geht zu www.example.com/page.phpund ich möchte ihn umleiten www.example.com/index.php. Wie würde ich dies ohne die Verwendung einer Meta-Aktualisierung tun? Ist es möglich?

Dies könnte sogar meine Seiten vor nicht autorisierten Benutzern schützen.

Sam
quelle
Sie können den Header in PHP aktualisieren: Header
Zack Marrapese
11
@ Sam: nur als Seitenknoten, nicht implementieren jede Art von protection from unauthorized usersüber Umleitung; So sollten die Dinge nicht gemacht werden;)
Strae
7
@Strae Was ist falsch daran, Seiten mit Weiterleitung zu schützen? Was ist dann der beste Weg?
6
@PravindaAmarathunga Redirect ist eines der Elemente, aber nicht das einzige. Stellen Sie nur sicher, dass geschützte Elemente für nicht autorisierte Benutzer überhaupt nicht ausgegeben werden. Die Weiterleitung des Browsers kann clientseitig deaktiviert werden. Beispiel: Wenn der Browser die Umleitung nicht ausführt und die ursprüngliche Seite wie gewohnt ausgegeben wird, was würde der Benutzer sehen? CMS führt normalerweise die Umleitung durch und druckt keine geschützten Elemente aus. Dabei wird die normale Ausgabe durch eine Höflichkeitsnachricht ersetzt.
Strae
@PravindaAmarathunga überprüfen Sie den Link von Markus Antwort: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Strae

Antworten:

1697

Zusammenfassung der vorhandenen Antworten plus meine eigenen zwei Cent:

1. Grundlegende Antwort

Sie können die header()Funktion verwenden, um einen neuen HTTP-Header zu senden. Dieser muss jedoch vor HTML oder Text ( <!DOCTYPE ...>z. B. vor der Deklaration) an den Browser gesendet werden .

header('Location: '.$newURL);

2. Wichtige Details

die () oder exit ()

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

Warum sollten Sie verwenden die()oder exit(): The Daily WTF

Absolute oder relative URL

Seit Juni 2014 können sowohl absolute als auch relative URLs verwendet werden. Siehe RFC 7231, der den alten RFC 2616 ersetzt hatte , bei dem nur absolute URLs zulässig waren.

Statuscodes

Der "Location" -Header von PHP verwendet weiterhin den HTTP 302- direkten Code, dies ist jedoch nicht der Code, den Sie verwenden sollten. Sie sollten entweder 301 (permanente Weiterleitung) oder 303 (andere) in Betracht ziehen .

Hinweis: W3C erwähnt, dass der 303-Header nicht mit "vielen Benutzeragenten vor HTTP / 1.1" kompatibel ist. Derzeit verwendete Browser sind alle HTTP / 1.1-Benutzeragenten. Dies gilt nicht für viele andere Benutzeragenten wie Spider und Roboter.

3. Dokumentation

HTTP-Header und die header()Funktion in PHP

4. Alternativen

Sie können die alternative Methode verwenden, für http_redirect($url);die das PECL-Paket pecl installiert werden muss.

5. Hilfsfunktionen

Diese Funktion enthält nicht den 303-Statuscode:

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

    exit();
}

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

Das ist flexibler:

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

6. Problemumgehung

Wie bereits erwähnt, header()funktionieren Weiterleitungen nur, bevor etwas ausgeschrieben wird. Sie schlagen normalerweise fehl, wenn sie in der HTML- Ausgabe aufgerufen werden. Dann könnten Sie eine HTML-Header-Problemumgehung (nicht sehr professionell!) Verwenden, wie:

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

Oder sogar eine JavaScript-Weiterleitung.

window.location.replace("http://example.com/");
Markus
quelle
5
Einige Probleme mit dieser Antwort: 303 ist möglicherweise nicht der "richtige" Statuscode. 301 kann zum Beispiel für Google erwünscht sein. Zweitens header('Location: '.$newURL);muss es sein, bevor HTML (oder Text) an den Browser übergeben wurde, sonst funktioniert es nicht richtig.
Chuck Le Butt
6
Die tägliche WTF-Geschichte ist leider weit verbreitet. Wie auch immer, es ist nicht der fehlende Würfel, der das Problem verursacht, sondern ein schlechtes Design. Das gewaltsame Schließen des Prozesses ist in 99,9% der Fälle falsch. Eine übliche, sauberere Lösung (sowieso nicht meine Lieblingslösung) besteht darin, eine RedirectionException auszulösen und sie am Einstiegspunkt Ihrer Anwendung abzufangen. Danach können Sie alle Ihre "After *" - Anrufe (Protokolle / Verbindungen schließen / was auch immer) haben
robertodecurnex
4
Das http-equiv="Location"wird nicht von allen Browsern unterstützt. Sie sollten refreshstattdessen verwenden! <meta http-equiv="refresh" content="0;url=http://example.com/">
Timo002
71
Stellen Sie niemals einen 301 aus , es sei denn, Sie meinen es ernst . 301 bedeutet permanent und permanent bedeutet permanent , was bedeutet , dass es von Benutzeragenten zwischengespeichert wird, was bedeutet, dass lange, mit Koffein gefüllte Nächte auf Anwendungsprotokolle starren und sich fragen, ob Sie verrückt werden, weil Sie schwören, dass eine Seite aufgerufen oder aktualisiert werden sollte und Sie schwören Für Gott funktioniert es auf Ihrer Maschine, aber nicht auf der des Kunden. Wenn Sie unbedingt eine 301 aufrufen müssen, legen Sie ein maximales Cache-Steuerelement für die Ressource fest. Sie haben keine unendliche Weisheit und sollten sich nicht so verhalten, wie Sie es tun.
Madumlao
2
Aber gibt es einen Grund, die Over-Exit-Funktion zu verwenden? Ausgang scheint sauberer und angemessener.
Ars265
122

Verwenden Sie die header()Funktion , um einen HTTP- LocationHeader zu senden :

header('Location: '.$newURL);

Im Gegensatz zu dem, was manche denken, die()hat dies nichts mit Umleitung zu tun. Verwenden Sie es nur, wenn Sie anstelle der normalen Ausführung umleiten möchten .

Datei example.php :

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

Ergebnis von drei Hinrichtungen:

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

Wiederaufnahme - obligatorisch die()/ exit()ist eine urbane Legende, die nichts mit tatsächlichem PHP zu tun hat. Es hat nichts damit zu tun, dass der Client den Location:Header "respektiert" . Das Senden eines Headers stoppt die PHP-Ausführung nicht, unabhängig vom verwendeten Client.

vartec
quelle
8
die () oder exit () ist für Kunden, die den Header "Location: ..." nicht respektieren
clawr
12
@clawr: Nein, exit()um zu verhindern, dass auf der Seite der verbleibende Inhalt angezeigt wird (denken Sie an eingeschränkte Seiten). vartec ist richtig, es hat nichts mit dem HTTP- Speicherort- Header zu tun und Sie müssen es nicht exit. Ich habe mich dafür entschieden, es in meine Antwort aufzunehmen, weil für jemanden, der nicht weiß, wie man eine einfache Weiterleitung durchführt, man genauso gut auf Nummer sicher gehen kann, anstatt keinen einfachen, aber entscheidenden Schritt zu implementieren, nur um den fortgeschrittenen Prozess nutzen zu können Steuerung.
Alix Axel
1
Browser, die den Header berücksichtigen, verlassen jedoch die Seite und schließen die Verbindung, während Ihr Skript noch ausgeführt wird. Das ist total schlecht. PHP wird das Skript für einige Zeit fortsetzen (aus diesem Grund wird Ihr Code ausgeführt), es kann jedoch während der Ausführung zufällig abgebrochen werden, sodass Probleme auftreten. Das Aufrufen von ignore_user_abort () verhindert dies, aber ich bin es aufrichtig nicht wert. Fahren Sie einfach mit Ihrem HTML-Schreibmaterial fort (obwohl es wahrscheinlich nutzlos ist), aber machen Sie keine Dinge, die nach einem Header auf die Festplatte oder Datenbank schreiben ('Location:'). Wenn möglich vor der Umleitung auf die Festplatte schreiben. [Auch: URL sollte absolut sein.]
FrancescoMM
Gibt es eine Möglichkeit zur Umleitung, bevor der Browser das HTTP-Protokoll erkennt? Der Grund, warum ich umleiten muss, ist, dass ich nicht genügend SSL-Zertifikate für alle meine Domains erhalten kann. Ich würde verwenden, .htaccessum umzuleiten, aber ich brauche eine Möglichkeit, um irgendwie weiterzuleiten, welche Domain an die endgültige Domain umgeleitet wird?
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);

Vergiss nicht zu sterben () / exit ()!

Alix Axel
quelle
6
Und vergessen Sie nicht die Ausgabepufferung, sonst erhalten Sie "Header bereits gesendet".
Kuroki Kaze
8
... und vergessen Sie nicht, dass Sie etwas ausdrucken wie "Sie werden in $ n Sekunden zu $ ​​nepage umgeleitet, klicken Sie hier auf $ link, wenn keine Umleitung erfolgt". Einige Broser und die Einstellungen einiger Browser schlagen möglicherweise um.
Strae
3
@DaNieL: Diese Art der Umleitung dauert nicht "$ n Sekunden". Es wird sofort geschehen, wenn es überhaupt passiert, und jeder konforme Browser sollte damit umgehen. Ich denke, Sie denken an die "Meta Refresh" -Umleitungen, die Leute verwenden, wenn sie es nicht besser wissen.
rmeador
1
@rmeador ... Für ältere Browser und Spezialbrowser. Sie sollten zuerst Ihren Standort-Header erstellen. Wenn dies fehlschlägt, haben Sie eine Meta-Umleitung mit dem Link "Sie werden in x Sekunden zur Seite umgeleitet" mit einem Link, falls die Meta-Umleitung fehlschlägt. Dies ist die richtige und ausfallsichere Methode für eine Weiterleitung.
Andrew Moore
3
Andrew: Wie kann der HTTP-Browser den Standort nicht respektieren?
Vartec
102

Geben Sie JavaScript aus PHP mit Echo aus, um die Aufgabe zu erledigen.

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

Sie können dies in PHP nicht wirklich tun, es sei denn, Sie puffern die Seitenausgabe und überprüfen später die Umleitungsbedingung. Das könnte zu mühsam sein. Denken Sie daran, dass Header das erste sind, was von der Seite gesendet wird. Der größte Teil der Weiterleitung wird normalerweise später auf der Seite benötigt. Dazu müssen Sie die gesamte Ausgabe der Seite puffern und später nach dem Umleitungszustand suchen. An diesem Punkt können Sie entweder den Seitenbenutzer-Header () umleiten oder einfach die gepufferte Ausgabe wiedergeben.

Weitere Informationen zum Puffern (Vorteile)

Was ist Ausgabepufferung?

Hammad Khan
quelle
2
Einfache und auf den Punkt Antwort! Ideal für eine einfache Seitenumleitung!
Stathis Andronikos
Auf diese Weise stoßen Sie nicht auf den allgemeinen Cannot modify header information - headers already sent byFehler.
Kai Noack
1
@hmd, was ist, wenn Javascript deaktiviert ist?
Istiaque Ahmed
@IstiaqueAhmed Javascript ist heutzutage fast immer aktiviert, aber wenn es deaktiviert ist, können Sie PHP-Puffer verwenden. Diese SO-Frage beantwortet das. Wenn Sie PHP Buffering verwenden, brauchen Sie diese Methode nicht, denke ich.
Hammad Khan
Falsch, Sie können (und sollten) dies auch ohne Pufferung in PHP tun: Auf einer gut gestalteten Seite sollte die gesamte relevante PHP-Verarbeitung stattfinden, bevor HTML-Inhalte an den Benutzer gesendet werden. Auf diese Weise funktionieren PHP-Weiterleitungen einwandfrei.
MestreLion
91

1. Verwenden der Header-Funktion mit exit()

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

Wenn Sie jedoch die Header-Funktion verwenden, erhalten Sie manchmal die Meldung "Warnung wie bereits gesendeter Header" , um zu beheben, dass vor dem Senden von Headern kein Echo oder Druck erfolgt, oder Sie können einfach die()oder exit()nach der Header-Funktion verwenden.

2. Ohne Header

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

Hier werden Sie kein Problem haben

3. Verwenden der Header-Funktion mit ob_start()undob_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
quelle
Arbeite wie ein Zauber. Ich verwende <? Php echo "<script> location.href = ' google.fr /' ; </ script >"; ?> Um es zu testen, und es tat, was ich wollte
DoctorDroid Haiti
1
Die zweite Lösung funktioniert nicht mit deaktiviertem JS.
Tajni
55

Die meisten dieser Antworten vergessen einen sehr wichtigen Schritt!

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

Wenn Sie diese wichtige zweite Zeile weglassen, werden Sie möglicherweise bei The Daily WTF landen . Das Problem ist , dass Browser nicht hat , um die Header zu respektieren , die Ihre Seite Rückkehr, so mit Header ignoriert werden, wird der Rest der Seite ohne eine Umleitung ausgeführt werden.

nickf
quelle
1
Wie wäre es, dem Benutzer eine Ausgabe zu geben, bevor das Skript beendet wird? Wissen Sie, die Leute lieben es zu wissen, was passiert ...
Strae
3
Sie gehen davon aus, dass das Skript nichts anderes zu tun hat, als umzuleiten. Was vielleicht überhaupt nicht stimmt.
Vartec
13
@DaNieL: ändere es in sterben ("Hör auf, meine Header zu ignorieren!")
nickf
3
Ich mochte diese einfache Erklärung von die();Ihnen - wenn Sie es nicht tun, kann der Benutzer die komplette Seite für einen Moment sehen, wenn Sie es verwenden; Der Benutzer wird umgeleitet und es wird kein temporärer Inhaltsfehler
angezeigt.
Es ist möglich, dass nützliche Aktivitäten auftreten, nachdem der Header gesendet wurde. Diese Aktivität sendet nichts an den Browser, protokolliert jedoch die Aktivität oder beendet die Aufzeichnung von Transaktionen. Aus diesem Grund hängt die Notwendigkeit von Die / Exit vom Skript ab.
DanAllen
28

Verwenden:

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

Oder wenn Sie bereits PHP-Tags geöffnet haben, verwenden Sie Folgendes:

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

Sie können auch auf externe Seiten umleiten, z.

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

Stellen Sie sicher, dass Sie einschließen exit()oder einschließen die().

jake
quelle
25

Sie können Sitzungsvariablen verwenden, um den Zugriff auf Seiten zu steuern und gültige Benutzer zu autorisieren:

<?php
    session_start();

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

    // Page goes here
?>

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

Vor kurzem bekam ich Cyber-Angriffe und entschied, dass ich die Benutzer kennen musste, die versuchten, auf das Admin-Panel oder einen reservierten Teil der Webanwendung zuzugreifen.

Daher habe ich in einer Textdatei einen Protokollzugriff für die IP-Adresse und die Benutzersitzungen hinzugefügt, da ich meine Datenbank nicht stören möchte.

Asuquo12
quelle
19

Viele dieser Antworten sind korrekt, setzen jedoch voraus, dass Sie eine absolute URL haben, was möglicherweise nicht der Fall ist. Wenn Sie eine relative URL verwenden und den Rest generieren möchten, können Sie so etwas tun ...

$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
Luke
quelle
16

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

Daniel A. White
quelle
Gibt es eine Möglichkeit zur Umleitung, bevor der Browser das HTTP-Protokoll erkennt? Der Grund, warum ich umleiten muss, ist, dass ich nicht genügend SSL-Zertifikate für alle meine Domains erhalten kann. Ich würde verwenden, .htaccessum umzuleiten, aber ich brauche eine Möglichkeit, um irgendwie weiterzuleiten, welche Domain an die endgültige Domain umgeleitet wird?
Oldboy
16

Verwenden Sie den folgenden Code:

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

Ich habe diese Frage bereits beantwortet, aber ich werde es erneut tun, da ich inzwischen erfahren habe, dass es Sonderfälle gibt, wenn Sie in CLI ausgeführt werden (Weiterleitungen können nicht stattfinden und sollten dies auch nicht exit()) oder wenn Ihr Webserver dies ist Ausführen von PHP als (F) CGI (es benötigt einen zuvor festgelegten StatusHeader, um richtig umzuleiten).

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

Ich habe auch die Frage der Unterstützung der verschiedenen HTTP - Umleitung Codes behandelt ( 301, 302, 303und 307), wie es in den Kommentaren meiner früheren Antwort gerichtet. Hier sind die Beschreibungen:

  • 301 - Dauerhaft verschoben
  • 302 - gefunden
  • 303 - Siehe Andere
  • 307 - Temporäre Umleitung (HTTP / 1.1)
Alix Axel
quelle
11

Verwenden Sie einfach den folgenden Code, um den Besucher auf eine andere Seite umzuleiten (besonders nützlich in einer bedingten Schleife):

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

In diesem Fall mypage.phpist dies die Adresse der Seite, zu der Sie die Besucher weiterleiten möchten. Diese Adresse kann absolut sein und auch die Parameter in diesem Format enthalten:mypage.php?param1=val1&m2=val2)

Relativer / absoluter Pfad

Wenn Sie sich mit relativen oder absoluten Pfaden befassen, ist es ideal, einen absoluten Pfad aus dem Stammverzeichnis des Servers (DOCUMENT_ROOT) auszuwählen. Verwenden Sie das folgende Format:

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

Wenn sich die Zielseite jemals auf einem anderen Server befindet, geben Sie die vollständige URL an:

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

HTTP-Header

Gemäß dem HTTP-Protokoll müssen HTTP-Header mit beforejeder Art von Inhalt gesendet werden. Dies bedeutet, dass niemals Zeichen vor dem Header gesendet werden sollten - nicht einmal ein leeres Feld!

Temporäre / permanente Weiterleitungen

Standardmäßig handelt es sich bei der oben dargestellten Art der Umleitung um eine vorübergehende Umleitung. Dies bedeutet, dass Suchmaschinen wie die Google-Suche die Umleitung bei der Indizierung nicht berücksichtigen.

Wenn Sie Suchmaschinen benachrichtigen möchten, dass eine Seite dauerhaft an einen anderen Ort verschoben wurde, verwenden Sie den folgenden Code:

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

Diese Seite enthält beispielsweise den folgenden Code:

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

Wenn Sie auf den obigen Link klicken, werden Sie automatisch zu dieser Seite weitergeleitet. Darüber hinaus handelt es sich um eine permanente Umleitung (Status: 301 Permanent verschoben). Wenn Sie also die erste URL in Google eingeben, werden Sie automatisch zum zweiten umgeleiteten Link weitergeleitet.

Interpretation des PHP-Codes

Der nach dem Header () befindliche PHP-Code wird vom Server interpretiert, auch wenn der Besucher zu der in der Umleitung angegebenen Adresse wechselt. In den meisten Fällen bedeutet dies, dass Sie eine Methode benötigen, um der header()Funktion der exit()Funktion zu folgen , um die Auslastung des Servers zu verringern:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>
Star
quelle
Warum (gegen Ende des zweiten Absatzes)? Meinst du &parastattdessen (so liest sich das Ganze mypage.php?param1=val1&param2=val2))? (Die HTML-Entität para ) ist "¶" - hat vielleicht ein externes Programm eine Konvertierung durchgeführt?).
Peter Mortensen
9

Verwenden:

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

Dies ist eine reguläre und normale PHP-Weiterleitung. Sie können jedoch eine Umleitungsseite mit einigen Sekunden Wartezeit mithilfe des folgenden Codes erstellen:

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

Am Vorabend des Semantic Web ist Korrektheit zu berücksichtigen. Leider verwendet der "Location" -Header von PHP immer noch den HTTP 302- Weiterleitungscode, der streng genommen nicht der beste für die Umleitung ist. Die, die es stattdessen verwenden sollte, ist die 303 .

W3C ist so freundlich zu erwähnen, dass der 303-Header nicht mit "vielen Benutzeragenten vor HTTP / 1.1" kompatibel ist, was bedeuten würde, dass derzeit kein Browser verwendet wird. Der 302 ist also ein Relikt, das nicht verwendet werden sollte.

... oder du könntest es einfach ignorieren, wie alle anderen ...

Henrik Paul
quelle
7

Sie können einige JavaScript-Methoden wie unten verwenden

  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
quelle
Javascript wird auf dem Client ausgeführt, der möglicherweise das ist, wonach Sie suchen.
Chharvey
7

Ja, Sie können die Funktion header () verwenden.

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

Außerdem empfiehlt es sich, die Funktion exit () direkt nach der header()Funktion aufzurufen , um die folgende Codeausführung zu vermeiden.

Laut Dokumentation header()muss aufgerufen werden, bevor eine tatsächliche Ausgabe gesendet wird.

Kasper
quelle
6

Wie andere hier sagten, senden Sie den Standort-Header mit:

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

Sie müssen dies jedoch tun, bevor Sie eine andere Ausgabe an den Browser senden.

Wenn Sie dies verwenden, um nicht authentifizierte Benutzer von bestimmten Seiten zu blockieren, wie Sie bereits erwähnt haben, denken Sie daran, dass einige Benutzeragenten dies ignorieren und trotzdem auf der aktuellen Seite fortfahren, sodass Sie sterben müssen ( ) nachdem Sie es gesendet haben.

Brent
quelle
but you need to do it before you've sent any other output to the browser. Genial!! Ich habe minutenlang gesucht, warum ich immer wieder die bereits gesendeten Header-Fehler erhalten habe. +1 !!
Josh
Allgemeiner gesagt, Sie haben / stoppen Ihr Skript vollständig /. die()ist nur ein Weg, das zu tun.
MauganRa
6

Hier sind meine Gedanken:

IMHO, der beste Weg, um eine eingehende Anfrage umzuleiten, wäre die Verwendung von Standort-Headern

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

Sobald diese Anweisung ausgeführt und die Ausgabe gesendet wurde, leitet der Browser den Benutzer um. Stellen Sie jedoch sicher, dass vor dem Senden von Headern keine Ausgabe (echo / var_dump) erfolgt ist, da dies sonst zu Fehlern führen kann.

Obwohl dies ein schneller und schmutziger Weg ist, um das zu erreichen, was ursprünglich gefragt wurde, würde es sich letztendlich als SEO-Katastrophe herausstellen, da diese Art der Weiterleitung immer als 301/302-Weiterleitung interpretiert wird, sodass Suchmaschinen Ihre immer sehen Indexseite als umgeleitete Seite und nicht als Zielseite / Hauptseite.

Daher wirkt es sich auf die SEO-Einstellungen der Website aus.

Bhaskar Pramanik
quelle
1
exit () sollte unmittelbar nach dem Header () verwendet werden
EKanadily
@docesam .. vereinbart .. exit () sollte sofort nach dem Aufruf von header () aufgerufen werden. Ich denke jedoch, wenn nach dieser header () - Anweisung keine Ausgabe mehr an den Browser erfolgt, ist exit () möglicherweise nicht erforderlich - nur meine Meinung
Bhaskar Pramanik
Ja, aber Sie müssen das erklären, weil jemand Ihre Codezeile in sein Skript kopieren könnte und dies möglicherweise dazu führen kann, dass er lange Zeit um sich herum kreist, um herauszufinden, was schief gelaufen ist.
EKanadily
1
@ BhaskarPramanik stellen Sie sich vor, Sie müssen eine Tür schnell abschließen, aber dann müssen Sie sie erneut ziehen / drücken / zerschlagen, um sicherzustellen, ob sie bereits verriegelt ist oder nicht ..
aswzen
5

Der beste Weg, um mit PHP umzuleiten, ist der folgende Code ...

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

Stellen Sie sicher, dass danach kein Code mehr funktioniert

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

Der gesamte Code muss vor der obigen Zeile ausgeführt werden.

Annehmen,

Fall 1:

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

Es wird ordnungsgemäß an den Speicherort (index.php) umgeleitet.

Fall 2:

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

Der obige Code wird nicht an den Speicherort (index.php) umgeleitet.

Sabuz
quelle
Es gibt bereits eine Antwort mit 1085, die die von Ihnen angegebenen Informationen und vieles mehr enthält.
Patrick Hund
5

Ja, es ist möglich, PHP zu verwenden. Wir werden auf eine andere Seite weiterleiten.

Versuchen Sie folgenden Code:

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

1. Verwenden Sie headereine integrierte PHP-Funktion

a) Einfache Umleitung ohne Parameter

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

b) Mit GET-Parametern umleiten

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

2. Mit JavaScript in PHP umleiten

a) Einfache Umleitung ohne Parameter

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

b) Mit GET-Parametern umleiten

<?php
     $id = 2;
     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";
   ?>
Shaan Ansari
quelle
Das Javascript-Bit war irgendwie das einzige, was beim endgültigen Hosting der Site funktionierte. Ich glaube, es ist eine Frage des Caching, aber damit habe ich es sofort gelöst.
cdsaenz
3

Wir können es auf zwei Arten tun:

  1. Wenn der Benutzer auf https://bskud.com/PINCODE/BIHAR/index.php gelangt, leiten Sie zu https://bskud.com/PINCODE/BIHAR.php weiter

    Durch den folgenden PHP-Code

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

    Speichern Sie den obigen Code unter https://bskud.com/PINCODE/BIHAR/index.php

  2. Wenn eine Bedingung erfüllt ist, leiten Sie auf eine andere Seite weiter:

    <?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
quelle
Was ist das? Bitte verwenden Sie keine Links zu Ihrer eigenen Website. Das zweite Beispiel verwendet die Javascript-Umleitung und nicht die PHP- header()Funktion.
Scriptman
2

Verwenden:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>
Joshua Charles Pickwell
quelle
1
Können Sie die Funktion Ihres Codes erklären? Ihre Antwort wurde aufgrund ihrer Länge und ihres Inhalts markiert.
www139
2

Es gibt mehrere Möglichkeiten, dies zu tun, aber wenn Sie es vorziehen php, würde ich die Verwendung der header()Funktion empfehlen .

Grundsätzlich

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

Wenn Sie es noch besser machen möchten, verwenden Sie es am besten in Funktionen. Auf diese Weise können Sie Authentifizierungen und andere Überprüfungselemente hinzufügen.

Versuchen wir es, indem wir die Ebene des Benutzers überprüfen.

Angenommen, Sie haben die Berechtigungsstufe des Benutzers in einer aufgerufenen Sitzung gespeichert u_auth.

In dem 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;
        }
     }

     . . .

Sie rufen dann die Funktion für jede Seite auf, die Sie authentifizieren möchten.

Wie in page.phpoder einer anderen Seite.

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

    . . .

Verweise;

Pyr James
quelle
2

Ich mag die Art der Umleitung im Laufe der Zeit.

<?php

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

Verwenden der Header-Funktion für das Routing

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

Angenommen, wir möchten von der A.php- Datei zur B.php- Route weiterleiten , als wir Hilfe von <button>oder benötigen<a> . Sehen wir uns ein Beispiel an

<?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
quelle
Können Sie die genaue oder gute Lösung anbieten?
Mehedi Abdullah
Es gibt bereits viele Lösungen. Ihre Lösung hat HTML und PHP ohne PHP-Tags gemischt. Zweitens senden Sie nach dem Drucken von HTML-Code einen Header, damit dies nicht funktioniert. Und der Name der Beispieldateien ist schlecht. Sie sollten sie nicht A.php und B.php nennen. Ich weiß, dass dies nur ein Beispiel ist, aber Sie sollten sich trotzdem um die Namenskonvention kümmern.
Tajni
1

Wenn Sie mit Apache arbeiten, können Sie auch .htaccess für die Umleitung verwenden.

Redirect 301 / http://new-site.com/
michal.jakubeczy
quelle
1

Sie können versuchen, die PHP- headerFunktion für die Umleitung zu verwenden. Sie sollten den Ausgabepuffer so einstellen, dass Ihr Browser keine Umleitungswarnung auf den Bildschirm wirft.

ob_start();
header("Location: " . $website);
ob_end_flush();
Doruk Ayar
quelle
1
exit () sollte unmittelbar nach dem Header () verwendet werden. Auch die Out-Pufferung ist seit einiger Zeit standardmäßig automatisch aktiviert.
EKanadily
0

Probier diese

 $url = $_SERVER['HTTP_REFERER'];
 redirect($url);
Shareque
quelle