|
PHP Header, PHP Redirect
Der header ist ein Teil, der bei jedem Seitenaufruf mit dem Browser
mitgesendet wird. Der header ist normalerweise nicht sichtbar, es sei denn
man benutzt extra Tools um ihn sichtbar zu machen. In ihm werden Informationen
gespeichert und mitgesendet ; so zum Beispiel Daten die man aus Formularen
per $_POST versendet.
Der Header wird immer zuerst gesendet, dann Seiteninhalte !
Den Header in php auslesen:
<?php $headers = headers_list(); foreach ( $headers as $header ) { echo "<li>$header</li>"; } ?>
|
So sieht Dein aktueller Header aus:
Content-Type: text/html; charset=ISO-8859-1
Es gibt nun Möglichkeiten die Informationen in diesem Header zu beeinflussen,
dies muss allerdings geschehen bevor auch nur ein Zeichen gesendet wurde. Hat man
nur ein Zeichen gesendet, ist es nicht mehr möglich den bereits gesendeten(!)
Header zu beeinflussen. Eine beliebte Fehlerquelle ist hierbei, dass wenn man den
Code in php mit <?php einleitet, dass man vor der eckigen Klammer ausversehen
ein Leerzeichen macht. Wenn der PHP Code beendet wird, und es steht nach dem ?>
noch ein Leerzeichen wird man auch Fehlermeldungen bekommen, da bereits Zeichen
gesendet wurden, bevor wir in PHP den Header beeinflussen konnten.
PHP Redirect
Eine beliebte und häufige Art mit dem Header zu arbeiten, ist es den
Status eines Seitenaufrufes zurück zu schicken, oder den User einfach
weiter zu leiten.
Ein php Weiterleitungsbeispiel:
<?php header("Location: http://www.google.de"); exit; ?>
|
Hiermit leiten wir den Surfer auf die Seite von Google weiter. Danach quittieren
wir die weitere Abarbeitung des PHP Programmes mit exit;, weil sonst noch
weitere Programmteile abgearbeitet werden würden.
Header Status 404, 301, 302 und andere
<?php header("HTTP/1.0 404 Not Found"); ?>
|
Hiermit teilen wir dem Surfer mit, dass es die angeforderte Seite nicht gibt
(404). Dies kann wichtig sein, wenn man zum Beispiel mit mod_rewrite arbeitet und
sämtliche aufgerufene Adressen auf die index.php umleitet. Jeder Seitenaufruf
wäre gültig, da die Internetadresse immer an die index.php weitergegeben
würde, wir aber nicht unbedingt zu jeder Adresse auch Inhalt liefern können/wollen.
Suchmaschinen wie google machen auch Spamtests und rufen willkürliche Internetadressen
auf den Seiten auf, um zu gucken ob der Webmaster rumspammt und sich davon eine
bessere Suchmaschinenpositionierung erhofft.
Es gibt nun verschiedene Nummern die man für die Statusangabe verwenden kann.
Die häufigsten sind folgende:
# 200 OK # 301 Moved Permanently # 302 Found # 304 Not Modified # 307 Temporary Redirect # 400 Bad Request # 401 Unauthorized # 403 Forbidden # 404 Not Found # 500 Internal Server Error # 501 Not Implemented
|
Generell leitet man am besten direkt über die .htaccess Datei den User weiter, sofern
dies möglich ist. Suchmaschinen reagieren je nach Weiterleitungsnummer unterschiedlich.
Hier finden Sie ein paar Informationen dazu.
Eine genaue Übersicht über die Statuscodes erhalten Sie auf Wikipedia.
Aussagekräftig ist immer die erste Zahl einer Nummer:
1xx = Informationen
2xx = Erfolgreiche Operation
3xx = Umleitung
4xx = Client Fehler
5xx = Server Fehler
Sollte man Wert auf Suchmaschinenoptimierung legen, sollte man sich die unzähligen
Beiträge dazu durchlesen, mit welcher Nummer man weiterleiten sollte. Andernfalls
kann es passieren, dass man unerwünschte Ergebnisse produziert die einen in den
Suchergebnissen zurück oder ganz raus werfen.
Download einer Datei
Sie können auch auf eine URL weiterleiten und der User bekommt von Ihrem PHP
Skript eine Datei zum Download angeboten, anstelle von visuellen Inhalten im Browser.
Diese Lösung habe ich mal dazu benutzt, um den Downloadspeed der einzelnen User
variabel regeln zu können. So kann auch geprüft werden, ob der einzelne
User berechtigt ist diese Datei downloaden zu dürfen.
Jeder kennt Seiten wie Fileplanet, Gamershell u.a. Man ist in einer Download Warteschlange und bekommt
dann das File zum Download. Jenachdem ob man bezahlender Kunde ist, kann es sein dass
einem der Downloadspeed gedrosselt wird. Meist haben die Downloaddateien noch sehr
lange nicht lesbare Namen. Wenn Sie sich dafür interessieren Dateinamen zu
erstellen, die gar nicht existieren sondern nur eine kurze Zeit verfügbar sind,
dann suchen Sie mal nach Softlinks. Diese können auch in PHP erstellt werden.
Nach Aufruf der Datei können Sie als erstes prüfen, ob genau der User der diese Adresse aufruft auch
dazu berechtigt ist diese Datei downzuloaden. Er könnte die Adresse ja auch
weitergegeben haben. Dann schicken Sie ihm zum Beispiel eine PDF Datei:
<?phpphp // Wir werden eine PDF Datei ausgeben header('Content-type: application/pdf');
// Es wird downloaded.pdf benannt header('Content-Disposition: attachment; filename="downloaded.pdf"');
// Die originale PDF Datei heißt original.pdf readfile('original.pdf'); ?>
|
Wir haben festgelegt, dass es sich um application/pdf handelt. Über die
Content-Disposition haben wir den Anhang bestimmt. Readfile übernimmt dann den
Rest und sendet die Datei an den Surfer. In diesem Fall bekommt er allerdings die
Datei mit vollem Downloadspeed.
Ein weiteres Beispiel für den Download einer Datei:
<?phpphp $_file = 'original.zip';
header("Content-Type: application/zip; "); header('Content-Disposition: attachment; filename="anders.zip"'); header("Content-Transfer-Encoding: binary"); header("Content-Length: " . filesize($_file) ."; "); header("filename=\"".$_file."\"; ");
readfile($_file); ?>
|
Das Originalfile heisst original.zip, während es beim User als anders.zip ankommt.
Hier im Header geben wir gleich die Größe des Files mit an.
Downloadgeschwindigkeit begrenzen
Will man den Downloadspeed begrenzen müsste man mit einer Schleife arbeiten.
In diese schreibt man sleep(1);, und schickt Ihm nicht gleich die gesamte
Datei sondern nur häppchen. Man kann die gewünschte Datei über fopen();
öffnen und mit fread nur das lesen, was er gerade bekommen soll, bis er alles hat.
Content-Type
Anstelle von pdf können wir auch andere
Dateitypen bestimmen, damit der Downloader auch immer richtig auf die angegebene
Datei reagiert.
Weitere Content-Typen:
pdf = application/pdf exe = application/octet-stream zip = application/zip doc = application/msword xls = application/vnd.ms-excel ppt = application/vnd.ms-excel gif = image/gif png = image/png jpg = image/jpg mp3 = audio/mpeg wav = audio/x-wav mpg = video/mpeg mov = video/quicktime avi = video/x-msvideo
|
Cachen von Seiten verhindern
Wenn man verhindern will, dass die aufgerufene Seite gecached wird, kann man dies
auch über den Header mitteilen. Genauso kann man auch bestimmen bis wann die
Seite gecached (gespeichert) werden soll - so wird die Seite nicht erneut vom
Server abgerufen, sondern dem Surfer erneut bis zu dem angegebenen Datum angezeigt
solange sie gültig ist.
<?php header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-cache"); header("Pragma: no-cache"); ?>
|
In diesem Fall wurde das Datum in die Vergangenheit gesetzt und no-cache angegeben.
So verhindert man, dass der Browser eine Gültigkeit der Seite für die Zukunft
vermutet und sie erneut abruft, falls der User nochmal auf die Seite klickt. Andererseits
könnte man auch auf cache stellen und das Datum in die Zukunft setzen. So wäre
die Seite noch für eine gewisse Zeit gültig und würde bei erneutem Klick
nicht erneut vom Server abgerufen werden, da der User diese Version der Seite ja bereits
hat.
|