• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

mod_rewrite & Datei-Download

DarkDragon193

Neues Mitglied
[Gelöst] mod_rewrite & Datei-Download

In http://www.html.de/php/36245-einen-datei-downloaden-aber-nur-mit-passwort.html wurde besprochen, wie man einen Dateidownload mit einem Passwort schützt. Mein Weg wäre mittels mod_rewrite. Noch immer funktioniert das ganze nicht und ich weiß einfach nicht, wie ich das Problem gelöst bekomme. Auch mermhaus's Codeschnippsel hat mir nur bedingt geholfen.

Die .htaccess sieht nun so aus:
Code:
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 );
		}
	}
?>
Wieder gehe ich davon aus, dass die Anforderung beim Öffnen der Datei wieder umgeleitet wird. Wie schaffe ich das jetzt..?

Ratlos wie eh und je,

DarkDark1993
 
Zuletzt bearbeitet:
Werbung:
Was funktioniert daran nicht?

Was passiert?

Was erwartest Du?

Und wieso öffnest Du nur deswegen noch ein Topic?
 
Was funktioniert daran nicht?
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

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)
 
Werbung:
fopen() versucht einen lokalen Pfad zu öffnen. Diesen hast Du mit

Code:
/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... :D
 
Zuletzt bearbeitet:
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
 
Werbung:
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... :)
 
Zurück
Oben