Hallo Flo,
Oha, ganz so versiert bin ich leider, gerade mit dem HTTP-Header-Krams noch nicht.
Was nicht ist, kann noch werden.
mich versucht ein wenig klug zu lesen. Hat aber leider nicht viel gebracht.
Könnt ihr das vielleicht noch mal kurz Praxisnäher erklären (Code). Und was ich damit genau bewirke.
Mit der PHP-Funktion Header schickst Du einen HTTP-Header mit. Dieser kann entweder der Statuscode sein, oder ein zusätzliches Feld.
Zuerst musst Du einen Statuscode senden. Dies machst Du, indem Du nach HTTP/ die verwendete Version von HTTP (entweder 1.0 oder 1.1) sendest, danach ein Leerzeichen, danach der Statuscode und danach ein kurzer englischer Text.
Der Statuscode
HTTP/1.1 303 See Other
bewirkt zum Beispiel, dass der Browser weiß, dass er auf eine andere Seite umleiten muss, auf der dann das Ergebnis der Anfrage steht. Dieses Ergebnis darf der Browser dann auch cachen. Die verwendete HTTP-Version (einschließlich HTTP/) bekommst Du über $_SERVER['SERVER_PROTOCOL']. Bei dieser Lösung musst Du noch sehen, ob HTTP/1.0 verwendet wird, wenn das der Fall ist, dann solltest Du "302 Found" senden, (genaugenommen macht das PHP automatisch, wenn Du keinen eigenen Statuscode sendest und eine Weiterleitung (s.u.) machst) denn HTTP/1.0 kennt kein "303 See Other". ("302 Found" klappt auch bei HTTP/1.1, aber das war eigentlich für etwas anderes gedacht, und nur weil die Browser sich wie gewünscht verhalten, heißt das noch lange nicht, dass das so bleiben muss, deswegen solltest Du für HTTP/1.1 den »richtigen« Statuscode verwenden)
Sönke hat statt dem 303-Status-Code vorgeschlagen, "201 Created" oder "202 Accepted" zu verwenden. Ich persönlich bin gegen diese Lösung, aber diese Lösungen dürften an sich auch funktionieren, vom Code her ist es etwa die gleiche. (Sowohl 201 als auch 202 gibte es auch in HTTP/1.0, daher brauchst Du keine Abfrage wie bei 302 oder 303) Der Code "201 Created" bedeutet, dass die geforderte Resource erstellt wurde. Der Code "202 Accepted" heißt, dass die Anfrage akzeptiert wurde, aber sie noch in Bearbeitung ist. Beide beinhalten eine Weiterleitung. IMHO sind diese Statuscodes aber unpassend, denn die Anfrage ist a) fertig und b) hast Du keine HTTP-Resource erstellt.
Danach musst Du noch mitgeben, auf welche Seite er weiterleiten soll. Dazu solltest Du den Location-Header verwenden. Der Location-Header sieht so aus:
Location: Zieladresse
Wobei Zieladresse eine _absolute_ Adresse _einschließlich_ http://... sein muss. Also z.B. http://selfhtml.teamone.de/html/. Wenn ein entsprechender Statuscode, der eine Weiterleitung impliziert, mitgesendet wurde, dann leitet der Browser automatisch auf die neue Resource weiter. (Beziehungsweise sollte er es tun, und je nach Statuscode sollte er vorher den Benutzer fragen, die Benutzerabfrage macht aber bisher überhaupt keinen Browser - was genau wann zu tun ist, ist an den enspr. Stellen des RFC 2616 beschrieben)
Zusammengefasst:
Header ('...');
schickt den HTTP-Header ... (das macht jetzt hier natürlich wenig Sinn)
Als erstes musst Du einen passenden Statuscode verschicken. Danach musst Du den Location-Header verschicken, damit der Browser dann weiß, wohin. Bei der 303er-Lösung sähe das in Pseudocode so aus:
if (/* wenn die HTTP-Version 1.1 verwendet wurde */) {
/* sende den Header "HTTP/1.1 303 Found" */
}
/* andernfalls sendet PHP automatisch den 302-Status-Code */
/* hier jetzt den Location-Header versenden */
Ich hoffe, ich konnte Dir weiterhelfen.
Grüße,
Christian
P.S.: In der FAQ dieses Forums steht, wie man Links setzt, aber das nur nebenbei.
--
Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.