Ich möchte mal ein paar Dinge richtigstellen.
Erstens möchte ich nicht nur auf eine sinnlose Anzahl von Threads kommen.
Zweitens: Die mögliche Lösung der "fortgeschrittenen Lösung" (ich sehe ein es war vielleicht etwas überheblich) ist falsch.
Das zugehörige (ausbaufähige) Skript würde lauten:
So könnte etwas derartiges aussehen wenn man davon ausgeht dass vom PHP-Skript die Ziel-URL zurückgegeben wird.
Hallo barracuda. Ich geb zu, mein sehr ironischer Post macht es u.U. etwas schwer den Kernpunkt herauszulesen. Der Smiley sollte die Ironie andeuten, ich wollte dir nicht wirklich unterstellen, deine Postanzahl hochzutreiben, denn dafür hast du dir im Post viel zuviel Mühe gegeben. Aber der Kernpunkt des ganzen ist, dass deine Lösung mit der Frage nichts zu tun hat.
Worum es ging:
Eine Lösung, wie eine Datei, die außerhalb des Webroots liegt und somit auch nicht vom Webserver ausgelifert werden kann, mittels PHP gelesen und übertragen werden kann. Könnte die Datei per Webserver ausgeliefert werden, könnte jeder diese Datei herunterladen. Eine Überprüfung des Users wäre nicht möglich (HTTP AUTH ausgenommen, aber wenn schon eine Session existiert, wozu sollte man dann den User noch einmal authentifizieren). Der tradierte Weg dazu ist folgender:
- Das PHP Skript öffnet die Datei, es kann ohne Problem jede Datei auf dem Rechner öffnen, deren Rechte entsprechend gesetzt sind. Meinetwegen /tmp/korinthe (Über den Webserver kann man nicht an diese Datei, denn der Webroot sei /srv/www/htdocs, dies ist beabsichtigt)
- Das PHP Skript checkt irgendwie ob der Download erlaubt sein soll (Session Management, IP, Die Sekunden der aktuellen Zeit sind eine Primzahl oder was auch immer)
- Falls der Download erlaubt ist, manipuliert das PHP Skript den Header der Response und setzt unter anderem Content-type (z.B. auf application/pdf )
- Das PHP Skript öffnet die Datei /tmp/korinthe, liest sie ein und gibt sie als Response aus
- Der Browser fragt wie üblich ob er speichern soll, öffnet die Datei oder was auch immer
Was du beschrieben hast:
Einen Weg, wie mittels JavaScript* ein Klick auf einen Button bewirkt, dass der location.href auf eine URL des Webservers gesetzt wird. Der Browser würde dasselbe tun, als wenn man diese Adresse in die Adressleiste eingetippt, er würde also den Webbrowser nach der Datei /tmp/korinthe fragen. Der Webbrowser kann dann nur versuchen /srv/www/htdocs/tmp/korinthe auszuliefern die nicht existiert, das Resultat: 404.
Das Problem: Deine Lösung lässt sich, und das ist eigentlich das traurige daran komplett ohne JavaScript schreiben und ist damit laut SelfHTML seit HTML 2.0 auf jedem Browser, egal wie eingestellt nutzbar:
Code:
<html>
<head />
<!-- Barracuda -->
<input type="button" value="Download" onclick="location.href='http://www.google.de'"/>
<!-- saeckereier, wenn es ein Button sein muss -->
<form method="GET" action="http://www.google.de">
<input type="submit" value="Download">
</form>
<!-- saeckereier Wenn man auch das Bild eines Buttons nehmen darf. Das kann man dann noch per CSS schön mit Mouse-Over ausstatten -->
<a href="http://www.google.de">Google</a>
</html>
Obenstehender Code ist auf Firefox, Konqueror und Internet Explorer getestet. Laufen wird er auch auf allen anderen. Das schärfste: Der Internet Explorer 6 hat bei mir das Beispiel mit JavaScript blockiert, weil er das als gefährlichen Content einstuft. Das zweite Beispiel mit dem form läuft trotzdem.
Ich hoffe, dass du dir die Mühe gemacht hast, bis hier zu lesen. Ich habe sie mir gemacht, bis hier zu schreiben damit jemand, der in Zukunft den Thread ausgräbt die Unterschiede sehen kann. Ich habe mich nach reiflicher Überlegung entschlossen, doch hier zu posten.
Ich habe das AJAX Beispiel nicht mehr umgesetzt, aber mir trotzdem die Mühe gemacht es mir anzuschauen. Und ich gebe zu, dass das ein sehr kreativer Weg ist um einen Link zu generieren, trotzdem erfüllt ein <a> Tag denselben Zweck. Da die Seite mit diesem Skript ohnehin per PHP ausgegeben würde, könnte man statt AJAX gleich den fertigen Link mit reinschreiben. Denn es geht nicht darum, wohin der Link zeigt, sondern darum, dass PHP die Datei ausliefern muss, weil es der Webserver nicht kann.
Über ein Feedback per PN würde ich mich ehrlich freuen.
* Stimmt, ich habe mich vertippt, habe es noch gesehen und beschlossen es nicht zu editieren, weil es nicht relevant ist ob man nun JavaScript braucht oder Java oder sonst etwas. Glaub mir bitte, dass ich den Unterschied kenne.