RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^file-download/.+$ index.php [NC,L]
RewriteRule ^.*$ index.php
Mit dem ursprünglichen „-“ würde ja kein Rewrite stattfinden, ist also nicht Sinn der Sache.
Der php-Code sieht nun so aus:
[PHP]<?php
$baseUrl = „/Downloads/“;
$path = parse_url( $_SERVER[ ‚REQUEST_URI‘ ], PHP_URL_PATH );
$path = substr( $path, strlen( $baseUrl ) );
// If a file was selected
if( 1 === preg_match( '#file-download/.+$#', $path ) ) {
fileDownload( "$baseUrl$path" );
}
function fileDownload( $path )
{
// Die Funktion verbleibt für den späteren Gebrauch.
startDownload( $path );
}
function startDownload( $path ) {
echo $baseUrl;
echo "<a href='$path'>$baseUrl$path</a>";
if( $resFile = fopen( $path, "r" ) ) { // Fehler: Die Datei wird nicht gefunden.
}
}
// List all Downloadable content
function ListDownloads( ) {
echo "<ul>";
ListDownloadsRec( $baseUrl . "file-download/" );
echo "</ul>";
}
function ListDownloadsRec( $folder ) {
if( $resDir = opendir( $folder ) ) {
while( $content = readdir( $resDir ) ) {
if( $content === '.' or $content === '..' )
continue;
if( is_dir( $content ) )
ListDownloadsRec( "$folder/$content" );
else
echo "<li><a href='$folder$content' title='Download'>$content</a></li>";
}
closedir( $resDir );
}
}
?>[/PHP]
Wieder gehe ich davon aus, dass die Anforderung beim Öffnen der Datei wieder umgeleitet wird. Wie schaffe ich das jetzt…?
Wie bereits geschildert, denke ich, dass die Anforderung der Datei bei fopen wieder umgeleitet wird. Dadurch wird die Datei nicht „gefunden“. Fehlerausgabe:
Warning: fopen(/Downloads/file-download/Bild.bmp) [function.fopen]: failed to open stream: No such file or directory in C:\xampp\htdocs\Downloads\index.php on line 36
Was passiert?
Siehe oben.
Was erwartest Du?
Ich hoffe, trotz der definierten Umleitung in der .htaccess, irgendwie an die Datei zu kommen… Das heißt die Umleitung verhindern. Nur wie?
Und wieso öffnest Du nur deswegen noch ein Topic?
Weil das meines Erachtens nach vom eigentlichen Thema des anderen Topics abweicht und nicht Mein Thread war. Ich finde es einfach unhöflich, den Thread eines anderen an sich zu reißen um die eigenen Interessen weiter zu verfolgen…
Hoffe, das kann man verstehen, ansonsten kann ich auch weiter in den „alten“ Thread schreiben, was wenig Sinn machen würde, wo dieser hier schon geöffnet ist. x)
fopen() versucht einen lokalen Pfad zu öffnen. Diesen hast Du mit
/Downloads/
angegeben und wie die Fehlermeldung zeigt, gibt es diesen Pfad nicht. Grund ist, dass /Downloads/ einfach nicht existiert.
Die meisten Webhostingpakete laufen in einem Verzeichnis wie z.B. /var/www/vhosts/domain.de/httpdocs oder irgendetwas anderes. Diesen Pfad musst du vor dein /Downloads/ noch anfügen. Welcher Pfad es bei dir ist sollte ein phpinfo() zeigen. Wenn Du das nicht hinbekommst, frag deinen Webhoster.
Ich dachte, der Schrägstrich am Anfang eines Pfades gibt an, dass der Pfad vom Root-Verzeichnis ausgeht… Naja, tieferes Einverständnis ist immer gut. Ich werde es gleich mal ausprobieren.
€dith: Okay, jetzt ist mir das peinlich. :oops: So ein banaler Fehler aufgrund mangelndem Vorwissen. Funktioniert jedenfalls super! Endlich verstehe ich, wie das geht…
Relative Pfade sind praktisch, weil sie flexibel sind. Aber der Umgang mit ihnen wird mitunter sehr unübersichtlich. Eine sehr nützliche Funktion ist deshalb in diesem Zusammenhang realpath.
[php]$path = ‚./layouts‘; // Verweis auf ein Unterverzeichnis „layouts“
echo realpath($path); // Absoluter Pfad zu diesem Verzeichnis[/php]
Na dass ist doch mal was. Ich arbeite ungern mit relativen Pfaden bei Gebrauch von mod_rewrite. Ich bin mir nie sicher, ob der Pfad auch weiterhin stimmt, wenn ein „Unterordner“ simuliert wird…