Download einer Datei außerhalb des DocumentRoot
am 12.09.2006 22:52:50 von Manuel Seber
Hallo,
ich weiß, dass das Thema schon diverse Male besprochen wurde, aber ich finde keine Lösung für mein Problem, obwohl ich Google schon drangsaliert habe.
Ich möchte per PHP Datei-Downloads realisieren. Die Dateien liegen hierbei außerhalb des DocumentRoot. Nun möchte ich den Fall abfangen, dass die zu
downloadende Datei nicht existiert, und zwar mit dem HTTP-Status-Code 404 und einer entsprechenden Seite, die per .htaccess ErrorDocument 404
festgelegt wurde.
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
funktioniert nicht.
Hat hier jemand einen Zaunpfahl für mich, mit dem er winken könnte?
Vielen Dank.
Re: Download einer Datei außerhalb des DocumentRoot
am 13.09.2006 02:53:41 von Hadanite Marasek
Hallo,
ich habe es gerade probiert und es mit Ethereal aufgezeichnet,
allerdings ohne .htaccess. Das Gequatsche zwischen Browser und Server
ist exakt gleich, wenn das Skript mit header 404 und eine nicht
existierende Datei aufgerufen wird (bis auf den unterschiedlichen
GET-Befehl, natürlich).
Im Access-Log erscheint auch der richtige Fehlercode (404 in beiden
Fällen). Ist übrigens Apache2.
Der einzige Unterschied ist, dass das Skript eine leere Seite liefert -
wie wäre es also mit einem "readfile("404.htm")", um dem Nutzer eine
schöne 404-Seite zu zeigen?
Ich schätze, dass das mit der .htaccess-Datei nicht funktioniert, weil
das Skript ja nach der .htaccess abgearbeitet wird und der Apache ja
zunächst davon ausgeht, dass die Datei existiert.
Gruss H. Marasek
Manuel Seber wrote:
> Hallo,
>
> ich weiß, dass das Thema schon diverse Male besprochen wurde, aber ich
> finde keine Lösung für mein Problem, obwohl ich Google schon
> drangsaliert habe.
>
> Ich möchte per PHP Datei-Downloads realisieren. Die Dateien liegen
> hierbei außerhalb des DocumentRoot. Nun möchte ich den Fall abfangen,
> dass die zu downloadende Datei nicht existiert, und zwar mit dem
> HTTP-Status-Code 404 und einer entsprechenden Seite, die per .htaccess
> ErrorDocument 404 festgelegt wurde.
>
> header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
>
> funktioniert nicht.
>
> Hat hier jemand einen Zaunpfahl für mich, mit dem er winken könnte?
>
> Vielen Dank.
Re: Download einer Datei außerhalb des DocumentRoot
am 13.09.2006 11:44:51 von dev-null-use-reply-adress
Manuel Seber schrieb:
> Ich möchte per PHP Datei-Downloads realisieren. Die Dateien liegen
> hierbei außerhalb des DocumentRoot. Nun möchte ich den Fall abfangen,
> dass die zu > downloadende Datei nicht existiert, und zwar mit dem
> HTTP-Status-Code 404 und einer entsprechenden Seite, die per .htaccess
> ErrorDocument 404 festgelegt wurde.
Das kann so nicht funktionieren. Ich versuche mal zu erklären weshalb.
Allgemeiner Fall:
1. Client fordert etwas vom Webserver an.
2. Webserver kann das nicht finden.
3. Webserver liefert ErrorDocument aus.
Dein Fall:
1. Client fordert Dein PHP-Script an.
2. Webserver findet es und läßt es erstmal von PHP parsen.
3. PHP-Script findet eine Datei nicht und schickt 404.
Was ist der Unterschied? Dein PHP-Script schickt den 404
eben an den Client. Der Webserver bekommt das nicht mit,
denn er wurde ja nur um das PHP-Script gebeten, was er auch
*immer* findet, behandeln bzw. an den Client ausliefern kann.
Lösung:
Du musst eine komplett eigene ErrorDocument-Behandlung schreiben.
Z.B. könntest Du per 302er auf das ErrorDocument weiterleiten,
welches dann natürlich aber auch noch ein 404er senden muß.
Allderdings wäre das IMHO auch nicht ganz sauber - erst umleiten
dann ablehnen.
Besser also erst einen 404er senden, dann im Script selber
eine Fehlerseite includen und den weiteren Scriptablauf beenden.
Gruß
JPM