1580 Stimmen

Wie mache ich eine Weiterleitung in PHP?

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

Angenommen, der Benutzer geht zu www.example.com/page.php und ich möchte sie weiterleiten zu www.example.com/index.php Wie kann ich dies ohne die Verwendung einer Meta-Aktualisierung tun? Ist das möglich?

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

0 Stimmen

Sie können die Kopfzeile in PHP aktualisieren: Kopfzeile

17 Stimmen

@Sam: nur als Nebenknoten, nicht implementieren jede Art von protection from unauthorized users über eine Weiterleitung; so sollte es nicht gemacht werden ;)

10 Stimmen

@Strae Was ist falsch daran, Seiten mit Redirect zu schützen? Was ist dann der beste Weg?

2073voto

markus Punkte 39397

Zusammenfassung der vorhandenen Antworten und meine eigene Meinung dazu:

1. Grundlegende Antwort

Sie können die header() Funktion, um einen neuen HTTP-Header zu senden, aber dieser muss vor jeglichem HTML oder Text an den Browser gesendet werden (also vor der <!DOCTYPE ...> Erklärung, zum Beispiel).

header('Location: '.$newURL);

2. Wichtige Details

sterben() o exit()

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

Warum Sie Folgendes verwenden sollten die() o exit() : Das tägliche WTF

Absolute oder relative URL

Seit Juni 2014 können sowohl absolute als auch relative URLs verwendet werden. Siehe RFC 7231 die das alte System ersetzt hatte RFC 2616 , wo nur absolute URLs erlaubt waren.

Status Codes

PHPs "Location"-Kopfzeile verwendet immer noch die HTTP 302 -Redirect-Code verwenden, handelt es sich um eine "temporäre" Weiterleitung, die Sie möglicherweise nicht verwenden sollten. Sie sollten entweder 301 (permanente Weiterleitung) oder 303 (andere).

Anmerkung: W3C-Erwähnungen dass der 303-Header mit "vielen Vor-HTTP/1.1-Benutzeragenten" nicht kompatibel ist. Die derzeit verwendeten Browser sind alle HTTP/1.1-Benutzeragenten. Dies gilt nicht für viele andere User Agents wie Spider und Robots.

3. Dokumentation

HTTP-Kopfzeilen und die header() Funktion in PHP

4. Alternativen

Sie können die alternative Methode der http_redirect($url); die den PECL-Paket pecl installiert werden.

5. Hilfsfunktionen

Diese Funktion enthält nicht den Statuscode 303:

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

    exit();
}

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

Dies ist flexibler:

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

6. Abhilfe

Wie erwähnt header() Umleitungen funktionieren nur, bevor etwas ausgeschrieben wird. Sie schlagen normalerweise fehl, wenn Mitten in HTML aufgerufen Ausgabe. Dann könnten Sie einen HTML-Header-Workaround verwenden (nicht sehr professionell!) wie:

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

Oder sogar eine JavaScript-Weiterleitung.

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

5 Stimmen

Es gibt 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 vor der Übergabe von HTML (oder Text) an den Browser erfolgen, sonst funktioniert es nicht richtig.

1 Stimmen

Wenn die neue URL durch Verkettung von Benutzereingaben erstellt wird, ist außerdem eine gewisse Bereinigung angebracht :)

7 Stimmen

Die tägliche WTF-Geschichte ist leider keine Seltenheit. Wie auch immer, es ist nicht der fehlende Würfel, der das Problem verursacht, sondern ein schlechtes Design. Das gewaltsame Beenden des Prozesses ist in 99,9 % der Fälle falsch. Eine gängige, sauberere Lösung (die ich allerdings nicht bevorzuge) ist es, eine RedirectionException zu werfen und sie am Einstiegspunkt der Anwendung abzufangen. Danach können Sie alle Ihre "After *"-Aufrufe (Protokolle/Verbindungen schließen/was auch immer)

156voto

vartec Punkte 124396

Verwenden Sie die header() Funktion um eine HTTP Location Kopfzeile :

header('Location: '.$newURL);

Im Gegensatz zu dem, was manche denken, die() hat nichts mit Umleitung zu tun. Verwenden Sie es sólo wenn Sie umleiten wollen stattdessen der normalen Ausführung.

Datei beispiel.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

Fortsetzen - obligatorisch die() / exit() ist eine urbane Legende, die nichts mit dem tatsächlichen PHP zu tun hat. Es hat nichts damit zu tun, dass der Client die Location: Kopfzeile. Das Senden eines Headers unterbricht die Ausführung von PHP nicht, unabhängig vom verwendeten Client.

8 Stimmen

Die() oder exit() ist für Clients, die den "Location: ..."-Header nicht respektieren

18 Stimmen

@clawr: Nein, exit() ist es, zu verhindern, dass die Seite den restlichen Inhalt anzeigt (man denke an eingeschränkte Seiten). vartec hat recht, es hat nichts mit dem HTTP Location Header zu tun und das müssen Sie auch nicht exit . Ich habe sie in meine Antwort aufgenommen, weil sie für jemanden, der nicht weiß, wie man eine einfach Wenn man sich umorientiert, sollte man lieber auf Nummer sicher gehen, als einen einfachen, aber entscheidenden Schritt zu unterlassen, nur damit man die Vorteile nutzen kann. erweiterte Prozesskontrolle.

2 Stimmen

Bu

124voto

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

    exit();
}

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

Vergessen Sie nicht die() / exit() !

6 Stimmen

Und vergessen Sie nicht die Ausgabepufferung, sonst erhalten Sie die Meldung "Headers already sent".

8 Stimmen

... und vergessen Sie nicht, etwas wie "Sie werden in $n Sekunden auf $nepage weitergeleitet, klicken Sie hier auf $link, wenn die Weiterleitung nicht erfolgt" auszudrucken. Bei einigen Browsern und deren Einstellungen kann diese Weiterleitung fehlschlagen.

4 Stimmen

@DaNieL: Diese Art der Weiterleitung dauert nicht "$n Sekunden". Sie erfolgt sofort, wenn sie überhaupt stattfindet, und jeder konforme Browser sollte sie verarbeiten. Ich glaube, Sie denken an die "Meta-Refresh"-Weiterleitungen, die Leute benutzen, wenn sie es nicht besser wissen.

113voto

Juned Ansari Punkte 4656

1. Ohne Kopfzeile

hier werden Sie keine Probleme haben

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

2. Verwendung der Kopffunktion mit exit()

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

aber wenn Sie die Header-Funktion verwenden, erhalten Sie in manchen Fällen "Warnung wie Kopfzeile bereits gesendet" zu lösen, die vor dem Senden von Kopfzeilen kein Echo oder Druck erzeugen, oder Sie können einfach die() o exit() nach der Kopffunktion.

3. Verwendung der Kopffunktion mit ob_start() y ob_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
?>

1 Stimmen

Funktioniert wie ein Zauber. Ich verwende <?php echo "<script>location.href=' google.fr/';</script >"; ?> Um es zu testen, und es tat, was ich wollte

112voto

Hammad Khan Punkte 15166

Geben Sie JavaScript aus PHP mit echo aus, das diese Aufgabe übernimmt.

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

In PHP ist das nicht wirklich möglich, es sei denn, Sie puffern die Seitenausgabe und prüfen später, ob eine Umleitung vorliegt. Das könnte zu mühsam sein. Denken Sie daran, dass die Kopfzeilen 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 zwischenspeichern und später auf Umleitungsbedingungen prüfen. Zu diesem Zeitpunkt können Sie entweder die Seite mit header() umleiten oder einfach die gepufferte Ausgabe als Echo ausgeben.

Mehr über Pufferung (Vorteile)

Was bedeutet Ausgabepufferung?

3 Stimmen

Einfache und treffende Antwort! Großartig für eine einfache Seitenumleitung!

0 Stimmen

Und auf diese Weise stoßen Sie nicht auf die üblichen Cannot modify header information - headers already sent by Fehler.

1 Stimmen

@hmd, was ist, wenn javascript deaktiviert ist?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X