Variablen leeren
Ralf
- php
Hallo,
kann man mit einem PHP-Ausdruck alle Variablen im Head, also die, die mit dem Link übertragen, z.b. http://test.de/test.php?tes1=1&test2=2 werden löschen, dami nur noch http://test.de in der Adresszeile des Browsers steht?
Ralf
Hallo Ralf,
mit PHP wird das schon zu spät sein, denn wenn der Interpreter aktive wird, hat der Server ja bereits alles an das Script weitergeleitet und einen 200 oder einen 304 geschickt.
Wenn man jetzt im Script eine Umleitung (302) mit header("Location: ...."); auf sich selbst ohne GET-Parameter aufbaut, wird die Seite erneut aufgerufen und Du hast eine Endlosschleife gebaut.
Da würde ich also mal in der httpd.conf suchen. Denn Das Richtigstellen der aufgerufenen URi ist Sache des Webservers und nicht des API.
Liebe Grüße aus http://www.braunschweig.de
Tom
mit PHP wird das schon zu spät sein, denn wenn der Interpreter aktive wird, hat der Server ja bereits alles an das Script weitergeleitet und einen 200 oder einen 304 geschickt.
Der Server schickt gar nichts, solange das der Interpreter bzw. das Skript nicht sagt, daß er etwas schicken soll.
Wenn man jetzt im Script eine Umleitung (302) mit header("Location: ...."); auf sich selbst ohne GET-Parameter aufbaut, wird die Seite erneut aufgerufen und Du hast eine Endlosschleife gebaut.
Wohl kaum. Er will nur die Parameter weg haben, warum sollte er noch eine Weiterleitung machen, wenn die URL gar keine Parameter (mehr) hat?
Gruß,
soenk.e
PS: Das alles unabhängig davon, daß ich einer derartigen Weiterleitungsaktion ein nicht zu unterschätzendes Nervpotential auf Seiten des Nutzers zumesse.
Hallo Soenke,
mit PHP wird das schon zu spät sein, denn wenn der Interpreter aktive wird, hat der Server ja bereits alles an das Script weitergeleitet und einen 200 oder einen 304 geschickt.
Der Server schickt gar nichts, solange das der Interpreter bzw. das Skript nicht sagt, daß er etwas schicken soll.
Heißt das also, dass das Script erst mit seinem ersten Schreibvorgang auf stdout den Server zum z.B. 200 veranlasst? Und wenn ich im Script einen Header produziert habe, wird der stattdessen gesandt? Wird denn alles überschreiben oder nur die Angaben, die im Script neu gesetzt wurden? Oh,jeh. Ich hoffe, DU schickst mir jetzt kein 301 ohne neues Ziel...
Wenn man jetzt im Script eine Umleitung (302) mit header("Location: ...."); auf sich selbst ohne GET-Parameter aufbaut, wird die Seite erneut aufgerufen und Du hast eine Endlosschleife gebaut.
Wohl kaum. Er will nur die Parameter weg haben, warum sollte er noch eine Weiterleitung machen, wenn die URL gar keine Parameter (mehr) hat?
Klar, man könnte also fragen, ob $_GET irgendwas enthält und nur dann eine Umleitung veranlassen OHNE Parameter.
Umleitungen sind nervig, das sehe ich auch so. Allerdings merkt der Client in der Regel ja gar nichts davon, wenn die erste Antwort prompt kommt. Die paar Byte Header machen da dann auch nichts mehr aus. Die ganze Seite muss ich ja nicht mitschicken.
Gibt es eigentlich Browser, die diese 302er nicht unterstützen?
Liebe Grüße aus http://www.braunschweig.de
Tom
Der Server schickt gar nichts, solange das der Interpreter bzw. das Skript nicht sagt, daß er etwas schicken soll.
Heißt das also, dass das Script erst mit seinem ersten Schreibvorgang auf stdout den Server zum z.B. 200 veranlasst?
Nein, im Falle von CGI dürfte der Server erst einen Antwortcode senden, wenn die Kopfdaten vom Skript durch sind (d.h. sobald die erste Leerzeile nach stdout geschrieben wird). Anders kann er nicht reagieren, wenn das Skript ungültige Kopfdaten ausgibt (der berühmte 500er). Und möglicherweise möchte das Skript ja auch selbst den Antwortcode bestimmen, was natürlich nicht geht, wenn der Server die Antwort schon eigenmächtig geliefert hat.
Wenn es um ein Modul geht, sieht die Sache sowieso etwas anders aus, da der Interpreter dann direkt in die serverinterne HTTP-Verarbeitung eingebunden ist, auf serverinterne Ausgabe- und Verwaltungsfunktionen zugreifen kann und dementsprechend "stdout" keinerlei Bedeutung hat. Die Kopfzeilen werden beispielsweise beim Apache nicht einfach ausgegeben, sondern in eine Liste eingefügt, die dann auf Befehl gesendet wird.
Details zu den Interna finden sich im Kapitel "Apache API" der Anleitung.
Und wenn ich im Script einen Header produziert habe, wird der stattdessen gesandt? Wird denn alles überschreiben oder nur die Angaben, die im Script neu gesetzt wurden?
Das hängt von der Verarbeitung sowohl im Modul (z.B. CGI oder PHP) ab. Grundsätzlich kann alles passieren, die Kopfdaten werden im Apache (1) wie gesagt in einer separaten Liste geführt und erst auf Befehl gesendet. Was genau CGI- und PHP-Modul veranstalten, weiß ich nicht, da ich im Moment den Code nicht hier habe.
Umleitungen sind nervig, das sehe ich auch so. Allerdings merkt der Client in der Regel ja gar nichts davon, wenn die erste Antwort prompt kommt. Die paar Byte Header machen da dann auch nichts mehr aus. Die ganze Seite muss ich ja nicht mitschicken.
Womit Du allerdings recht hast.
Gibt es eigentlich Browser, die diese 302er nicht unterstützen?
Unwahrscheinlich. In RFC 2616 (HTTP 1.1) steht jedenfalls nur bei 303 der Hinweis, daß manche Clients (genauer gesagt alles vor 1.1) diesen Code (303) nicht kennen. 302 gehörte demnach wohl schon zu HTTP 1.0 und dessen Festlegung ist schon Jahre her (1.1 ist von '99).
Gruß,
soenk.e
Hallo Ralf,
kann man mit einem PHP-Ausdruck alle Variablen im Head, also die, die mit dem Link übertragen, z.b. http://test.de/test.php?tes1=1&test2=2 werden löschen, dami nur noch http://test.de in der Adresszeile des Browsers steht?
Für den Browser sind das keine Variablen, sondern einfach Teile der URL. Das einzige, was praktikabel wäre, wäre ein Frameset, um alles zu verstecken. Wenn Du die Variablen innerhalb von PHP löscht (unset) dann kennt PHP sie zwar nicht mehr, aber im Browser ändert sich nichts.
Du könntest auch über mod_rewrite nachdenken. (das ist IMHO die beste Alternative) Suche dazu mal im Archiv (http://selfsuche.teamone.de/) als auch in der Apache-Dokumentation. (http://httpd.apache.org/)
Christian
P.S.: ich empfehle Dir, als Test-URLs lieber test.test oder so anzugeben, denn Du kannst gerne mal schauen, wer auf test.de präsent ist. ;-)
kann man mit einem PHP-Ausdruck alle Variablen im Head, also die, die mit dem Link übertragen, z.b. http://test.de/test.php?tes1=1&test2=2 werden löschen, dami nur noch http://test.de in der Adresszeile des Browsers steht?
Das macht so alleine nicht allzu viel Sinn, was genau bezweckst Du damit?
Die Reinlichkeit der Adressleiste auf irgendeinem von Millionenen fremden Computern braucht Dich eigentlich nicht zu interessieren, stecke Deine Energie lieber in die eigenen Seiten; schon gar nicht lohnt es sich, den "unsauberen" Benutzer dadurch zu nerven, daß die Seite wegen der Parameter nochmal komplett neu geladen werden muß. Das ist nämlich die einzige Möglichkeit, die Adressleiste zu beinflussen: in Deinem Fall eine Weiterleitung durch das Skript an sich selbst, wobei von der aktuellen URL die Parameter abgeschnitten werden.
Skriptmanipulationen durch "eingeschmuggelte" Variablen werden weiterhin schon seit Monaten von PHP selbst verhindert, indem seit Version 4.1 externe Parameter nicht mehr automatisch als eigenständige Variablen registriert werden, sondern nur noch in entsprechenden Feldern wie zum Beispiel $_GET[] (bzw. $HTTP_GET_VARS[]) auftauchen (siehe phpinfo()-Ausgabe).
Falls Dein Hoster sich nicht um seinen Server kümmert, kannst Du das auch selbst bewerkstelligen, indem Du (beim Apache-Server) in der obersten .htaccess eine Zeile
php_flag register_globals off
einträgst (oder besser gleich den Hoster wechselst).
Gruß,
soenk.e