Frage Wie man eine Umleitung in PHP macht?


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

Sagen wir, der Benutzer geht zu www.example.com/page.php und ich möchte sie umleiten www.example.com/index.php, wie würde ich das ohne Meta-Refresh machen? Möglich?

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


983
2018-04-20 14:13


Ursprung


Antworten:


Zusammenfassung der vorhandenen Antworten plus meine eigenen zwei Cent:

1. Grundlegende Antwort

Du kannst den ... benutzen header() Funktion, um einen neuen HTTP - Header zu senden, aber dieser muss an den Browser vor jedem HTML - oder Text gesendet werden (also vor dem <!DOCTYPE ...> Erklärung zum Beispiel).

header('Location: '.$newURL);

2. Wichtige Details

sterben() oder Ausfahrt()

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

Warum sollten Sie verwenden? die() oder exit(): Der tägliche WTF

Absolute URL

Die URL muss absolut sein. Sehen RFC 2616. In den meisten Fällen wird jedoch auch eine relative URL akzeptiert.

Statuscodes

PHPs "Location" -Header verwendet immer noch die HTTP 302-redirect-Code, aber das ist nicht der, den Sie verwenden sollten. Sie sollten beides berücksichtigen 301 (permanente Weiterleitung) oder 303 (andere).

Hinweis: W3C erwähnt dass der 303-Header mit "vielen Pre-HTTP / 1.1-Benutzeragenten inkompatibel ist. Gegenwärtig verwendete Browser sind alle HTTP / 1.1-Benutzeragenten. Dies gilt nicht für viele andere Benutzeragenten wie Spider und Robots.

3. Dokumentation

HTTP-Header und die header() Funktion in PHP

4. Alternativen

Sie können die alternative Methode von verwenden http_redirect($url); was braucht das PECL-Paket pecl installiert werden.

5. Helfer Funktionen

Diese Funktion enthält den Statuscode 303 nicht:

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

    exit();
}

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

Dies ist flexibler:

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

6. Problemumgehung

Wie erwähnt header() Umleitungen funktionieren nur, bevor etwas ausgeschrieben wird. Sie scheitern normalerweise wenn wird in HTML aufgerufen Ausgabe. Dann könnten Sie eine HTML-Header-Problemumgehung verwenden (nicht sehr professionell!) Wie:

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

Oder eine JavaScript-Weiterleitung sogar.

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

1402
2018-04-20 14:19



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 ()!


89
2018-06-27 07:24



Ausgabe von JavaScript aus PHP mit echo, die den Job erledigt.

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

Sie können es wirklich nicht in PHP 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 Kopfzeilen als erstes von der Seite gesendet werden. 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. An diesem Punkt können Sie entweder den Seitenbenutzerheader () umleiten oder einfach die gepufferte Ausgabe wiederholen.

Für mehr über Pufferung (Vorteile)

Was ist Ausgabepufferung?


86
2018-04-20 14:14



Benutzen header() Funktion senden HTTP Location Header:

header('Location: '.$newURL);

Im Gegensatz zu einigen denken, die() hat nichts mit Umleitung zu tun. Benutze es nur wenn du umleiten willst stattdessen von normaler Ausführung.

beispiel.php:

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

Ergebnis oder 3 Ausführungen:

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 tatsächlichem PHP zu tun hat. Hat nichts damit zu tun, dass der Kunde "respektiert" Location: Header. Das Senden des Headers stoppt nicht die Ausführung von PHP, unabhängig vom verwendeten Client.


79
2018-04-13 12:44



1. Verwenden der Header-Funktion mit exit()

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

aber wenn Sie Header-Funktion verwenden, dann werden Sie einige Male erhalten "Warnung  wie Header schon senden " um zu beheben, dass nicht Echo oder Drucken vor dem Senden von Headern oder Sie einfach verwenden können die() oder exit() nach Kopffunktion.

2. Ohne Überschrift

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

Hier werden Sie kein Problem haben

3. Verwenden der Header-Funktion mit ob_start() und 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
?>

57
2018-04-20 14:24



Die meisten dieser Antworten vergessen ein sehr wichtiger Schritt!

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

Wenn Sie diese wichtige zweite Linie verlassen, sehen Sie, dass Sie am Ende sind Der tägliche WTF. Das Problem ist, dass Browser dies nicht tun haben Um die Header zu berücksichtigen, die von Ihrer Seite zurückgegeben werden, wird der Rest der Seite ohne Umleitung ausgeführt, so dass die Header ignoriert werden.


49
2018-05-16 13:12



<?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, zB:

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

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


23
2018-01-15 04:21



Viele dieser Antworten sind korrekt, aber sie gehen davon aus, dass Sie eine absolute URL haben, was möglicherweise nicht der Fall ist. Wenn Sie ein relative URL und generiere den Rest, dann kannst du sowas machen ...

$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

18
2017-09-09 10:48



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

<?php

session_start();

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

// Page goes here
?>

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

Vor kurzem bekam ich Cyberangriffe und entschied, dass ich die Benutzer wissen musste, die versuchen, auf Admin Panel oder reservierten Teil der Webanwendung zuzugreifen.

Daher habe ich eine Protokollzugriffs-IP und Benutzersitzungen in einer Textdatei hinzugefügt, weil ich meine Datenbank nicht belästigen möchte.


17
2018-04-28 21:31