Umleitungsfehler
bearbeitet von Zacharias Zucchini> ~~~php
> $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:
~~~php
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. Es ist insbesondere nicht so, dass ein zweiter Aufruf von header() den ersten überschreibt!
Du solltest den zweiten header()-Aufruf rausnehmen und im ersten header() durch echo ersetzen. Damit bekommst du ohne Umleitung die Location:-URL ausgegeben. Gibt dann diese URL in die Adresszeile deines Browsers ein. Ich vermute, sie wird dann 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.