Zacharias Zucchini: Umleitungsfehler

Beitrag lesen

$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.