Sara: Umleitungsfehler

Hallo,

ich habe ein kleines Script welches dafür sorgt, dass ich auf einen Link klicken kann um einen Beitrag zu löschen.

Meine URL stelle ich so zusammen

RewriteRule buecher/preise/([^/]*)$   produktpreise [l]

daraus ergibt sich: http://example.org/buecher/preise/ghzt75zthgzt

Die dazugehörigen PHP Zeilen


$seite = explode("/", $_SERVER['REQUEST_URI']);
$ziel  = $seite[3];

//Ausgabe zum testen ergibt ghzt75zthgzt
echo $ziel;

if(isset($_GET["delete"])){

  $delete = $_GET["delete"];
  $stmt = $mysqli->prepare("DELETE FROM buecher WHERE id=?");
  $stmt->bind_param("s",  $delete);
  $stmt->execute();
  $stmt->close();	
  header("Location: http://www.example.org/$ziel");

  // URL zum testen auf selfhtml.org ändern
  header("Location: https://forum.selfhtml.org");
}

Dieses header wird überhaupt nicht beachtet. Ich kann reinschreiben was ich will, nach dem Klick gelange ich auf die Seite http://www.example.org/buecher/preise/ghzt75zthgzt?delete**?12**

Ist aber doch falsch, warum wird header nicht beachtet?

Google Chrome spuckt folgende Meldung aus

Diese Webseite weist eine Weiterleitung auf. ERR_TOO_MANY_REDIRECTS

  1. $seite = explode("/", $_SERVER['REQUEST_URI']);
    $ziel  = $seite[3];
    
    //Ausgabe zum testen ergibt ghzt75zthgzt
    echo $ziel;
    
    if(isset($_GET["delete"])){
    
      $delete = $_GET["delete"];
      $stmt = $mysqli->prepare("DELETE FROM buecher WHERE id=?");
      $stmt->bind_param("s",  $delete);
      $stmt->execute();
      $stmt->close();	
      header("Location: http://www.example.org/$ziel");
    
      // URL zum testen auf selfhtml.org ändern
      header("Location: https://forum.selfhtml.org");
    }
    

    Dieses header wird überhaupt nicht beachtet. Ich kann reinschreiben was ich will, nach dem Klick gelange ich auf die Seite http://www.example.org/buecher/preise/ghzt75zthgzt?delete**?12** Ist aber doch falsch, warum wird header nicht beachtet?

    Diese Webseite weist eine Weiterleitung auf. ERR_TOO_MANY_REDIRECTS

    Grundsätzliche Beobachtung: Wenn du in einer Umleitungsschleife landest, wird header() auch ausgeführt, anderswo kann die Umleitungsschleife nicht herkommen.

    Dein Missverständnis ist vermutlich folgendes: header() erzeugt selbst keine Umleitung, sondern fügt die gegebene Zeile in den HTTP-Antwortkopf (daher "header") ein. Die Umleitung liest der Browser aus eben dieser speziellen Location:-Zeile in der HTTP-Antwort heraus.

    Du rufst zweimal header() mit Location: auf, dementsprechend dürfte die Antwort, die der Browser bekommt, wohl auch zwei Location:-Zeilen enthalten, in etwa so:

    HTTP/1.0 302 
    Location: http://www.example.org/zielurl
    Location: https://forum.selfhtml.org
    Bla: Fasel
    Tralala: und noch anderer, hier unwichtiger Krams
    

    Damit sagst du deinem Browser, "Gehe dahin (example.org) oder dorthin (selfhtml.org)" – und bei so einer nicht sinnvollen Antwort nimmt er dann halt die Erste. Insbesondere ist es nicht so, dass ein zweiter Aufruf von header() den ersten überschreibt, geschweige denn wortwörtlich eine Änderung an einer Weiterleitung durchführt!

    Du solltest den zweiten header()-Aufruf rausnehmen und den ersten zum Prüfen durch echo ersetzen ("header" raus, "echo" rein, sonst nix ändern). Damit bekommst du die ganze Location:-Zeile ausgegeben, so, wie sie der Browser auch sehen würde. Alternativ kannst du auch das HTTP-Protokoll deines Browsers zu rate ziehen, falls der sowas hat.

    Gib dann diese URL in die Adresszeile deines Browsers ein. Ich vermute, sie wird wieder in deinem Skript landen und würde (mit header() statt echo) wieder eine Weiterleitung auslösen. Nicht nachvollziehen kann ich an diesem Punkt, warum das so ist, denn /zielurl scheint so erstmal nicht auf dein RewriteRule-Muster zu passen – aber das kannst nur du genau prüfen.

  2. @@Sara

    //Ausgabe zum testen ergibt ghzt75zthgzt
    echo $ziel;header("Location: http://www.example.org/$ziel");
    

    Das dürfte auch nicht gehen. „Beachten Sie, dass Sie die Funktion header() aufrufen müssen, bevor Sie irgendeine andere Art von Ausgabe (seien es normale HTML-Tags, Leerzeilen in einer Datei oder von PHP) zum Client schicken.“ [php.net]

    LLAP 🖖

    --
    Ist diese Antwort anstößig? Dann könnte sie nützlich sein.