Probleme mit mod_rewrite

Moritz123

Erfahrenes Mitglied
Hallo!

ich habe auf meinem Server ein Download-Verzeichnis eingerichtet.
Innerhalb dieses Verzeichnisses liegt eine PHP-Datei, die die angeforderte Datei
über einen Query-String an den Browser "schickt", so dass sich der Speichern/Öffnen-Dialog öffnet.
Bsp:
Code:
Downzuloadende Datei:  test.jpg
zugehöriger Dateiaufruf: download.php?datei=test.jpg

Nun möchte ich mir aber das Eingeben des obigen sparen und habe zu diesem Zweck folgende .htaccess angelegt:
Code:
RewriteEngine On
RewriteBase /downloads

RewriteRule ^(.*)$ download\.php?datei=$1

Allerdings versucht er bei der Eingabe der Adresse /downloads/test.jpg die Datei downloads.php herunterzuladen.

Habe keine Ahnung wo der Fehler liegt...

Vielen Dank für eure Hilfe.
 
Nein, dass will ich eben nicht. Er soll die Datei an den Browser weiterleiten, die im Query-String angegeben ist. Spreche ich die download.php?datei=test.jpg an, liefert er mir die Datei test.jpg. Spreche ich das Ganze über den Pfad /downloads/test.jpg an, versucht er statt die Datei test.jpg die Datei download.php zu liefern. Und da liegt der Fehler. Ich weiß nur nicht wo bzw wie ich das ändern kann.
 
Der Code der download.php nehme ich an. Habe eine Sperre eingebaut,dass man diese Datei nicht herunterladen kann.

Hier aber trotzdem der Code:
PHP:
<?php
if(($_GET[datei] == ".htaccess") or ($_GET[datei] == ".htpasswd") or ($_GET[datei] == "explorer.php") or ($_GET[datei] == "download.php"))
{
echo "<h1>Error!</h1><h3>Beim Download ist ein Fehler aufgetreten!</h3><fieldset style=\"width:450px;\"><legend>&nbsp; Fehlerbeschreibung &nbsp;</legend><pre>Sie sind nicht authorisiert diese Datei herunterzuladen:&nbsp;<br><i>$_GET[datei]</i> !</fieldset>";
}
elseif ($_GET[datei] == "")
{
echo "<h1>Error!</h1><h3>Beim Download ist ein Fehler aufgetreten!</h3><fieldset style=\"width:450px;\"><legend>&nbsp; Fehlerbeschreibung &nbsp;</legend><pre>Es wurde keine Datei angegeben !</pre></fieldset>";
}
elseif (!file_exists($_GET[datei]))
{
echo "<h1>Fehler 404</h1><h3>Beim Download ist ein Fehler aufgetreten!</h3><fieldset style=\"width:450px;\"><legend>&nbsp; Fehlerbeschreibung &nbsp;</legend><pre>Es wurde keine Datei mit dem Namen <i>" . $_GET['datei'] ."</i> gefunden !<br>Bitte überprüfen Sie die Schreibweise oder<br>informieren Sie den Server-Admin.</pre></fieldset>";
}
else {
$datei = urldecode($_GET[datei]);
header ("Content-type: octet/stream");
header ("Content-disposition: attachment; filename=".basename($datei).";");
header("Content-Length: ".filesize($datei));
readfile($datei);
exit;
}
?>
 
Moritz123 hat gesagt.:
Der Code der download.php nehme ich an.

a) Genau, nimmst Du an - schaust aber nicht nach
b) Wieso fragst Du, wenn Du Hinweise auf Dein Problem ignorierst (okay, der Hinweis könnte direkter sein, aber er ist schon korrekt)
c) Der Internet Explorer ignoriert teilweise die Headerangabe zum Dateinamen und bietet dann einfach nur den Dateinamen des Scriptes an (download.php ist also wirklich die heruntergeladene Datei, nur das sie falsch heißt. Ändere die heruntergeladene download.php mal in den richtigen Dateinamen um und Du wirst sehen das es tatsächlich die Datei ist, die Du herunterladen wolltest.
d) Den Content-type: octet/stream würde ich je nach Datei auswählen lassen und nicht immer nur octet/stream) - wie das ganz einfach geht kann man in meinem Downloadprotector Tutorial sehen.

Fazit
Bitte nimm die Ratschläge auch an, wenn Du welche erfragst ...

[EDIT]
MÖÖP, ganzes Kommando zurück. Habe den Text nur überflogen - gestehe ich zu meiner Schande :)
Möglicherweise handelt es sich doch um ein ganz anderes Problem. Sorry.
Schau mal bitte nach ob nur der Dateiname falsch ist - wie ich schon erwähnt habe. Ansonsten gib noch mal Meldung :)
Danke
 
Zuletzt bearbeitet:
Probier mal folgendes Skript:
PHP:
<?php

	if( basename($_GET['datei']) == '.htaccess' || basename($_GET['datei']) == '.htpasswd' || basename($_GET['datei']) == 'explorer.php') || basename($_GET['datei']) == 'download.php' ) {
		header($_SERVER['SERVER_PROTOCOL'].' 401 Unauthorized');
		echo 'Sie sind nicht berechtigt diese Datei herunterzulagen.';
	} elseif( $_GET['datei'] == '' ) {
		header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
		echo 'Es wurde keine Datei ausgewählt.';
	} elseif( !file_exists($_GET[datei]) ) {
		header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
		echo 'Die angeforderte Datei wurde nichtgefunden.';
	} else {
		header('Content-Type: application/octet-stream');
		header('Content-Disposition: attachment; filename="'.urlencode(basename($_GET['datei'])).'"');
		header('Content-Length: '.filesize($_GET['datei']));
		readfile($datei);
		exit;
	}

?>
 
Also ich habe die download.php jetzt mal so abgeändert, dass die Datei die im Query-String angegeben wird auf jeden Fall an den Browser geschickt wird. Nach einem Test-Download habe ich die heruntergeladene Datei geöffnet und siehe da: die download.php.

Denke auch nicht, dass es an der download.php liegt, denn diese funktioniert bei "deaktiviertem" mod_rewrite-"Script" ohne Probleme. Nur ist dieses aktiviert, fängt das Ding an rumzuspinnen.
Zu sehen übrigens hier: http://moritz-maedler.de/downloads/dyndns.jpg
 
Das geht. Aber was passiert bei txt-Dateien, doc-Dateien, pdf-Dateien, mp3's usw usw.

Ich kann ja nicht ne Regel für jeden Dateityp festlegen...
 
Zurück