Rewrite Regel zu download.php

raphael123

New Member
Hello,

auf meinem Apache/2.4.25 (Debian) möchte ich den direkten Download von Dateien aus den Unterverzeichnissen /app/download und /app/upload verbieten, und mit einer rewirite-Regel auf download.php?file=BELIEBIGER-DATEINAME umleiten, damit ich prüfen kann, ob der Benutzer eingeloggt ist. Im Idealfall soll sich die ursprüngliche URL aber im Browser des Users nicht ändern (der Rewrite bzw. Redirect soll im Hintergrund stattfinden).

Beispiel-URLs:
- domain.de/app/uploads/BELIEBIGER-DATEINAME.XYZ
- domain.de/app/downloads/BELIEBIGER-DATEINAME.XYZ

Ziel-URLs:
domain.tdl/app/download.php?file=BELIEBIGER-DATEINAME.XYZ&folder=uploads
domain.tdl/app/download.php?file=BELIEBIGER-DATEINAME.XYZ&folder=downloads

BELIEBIGER-DATEINAME.XYZ kann sich natürlich dynamisch ändern.

Nun suche ich eine passende Rewrite-Regel.
Falls möglich möchte ich nicht extra "<Directory /var/ww/app/upload>" und "<Directory /var/ww/app/download>" anlegen, sondern die Regel unter "<Directory /var/ww/app>" erstellen.

Vielen Dank für eure Hilfe
 

GwenDragon

Registered User
Ungetestet:
Code:
RewriteCond %{REQUEST_URI} /app/(down|up)loads/  
RewriteRule /app/(.+)/(.+)\.(.+) /app/download.php?file=$2.$3&folder=$1 [L]
 
Last edited by a moderator:

raphael123

New Member
Ungetestet:
Code:
RewriteCond %{REQUEST_URI} /app/(down|up)loads/  
RewriteRule /app/(.+)/(.+)\.(.+) /app/download.php?file=$2.$3&folder=$1 [L]
Hallo,
danke für die Antwort. So funktioniert es zwar nicht, aber ich habe durch diese Vorlage eine funktionierende, jedoch nicht ganz zufriedenstellende Lösung gefunden:
Code:
RewriteCond %{REQUEST_URI} ^/app/(down|up)loads/(.*)$
RewriteRule ([^/]+)/([^/]+)$ download.php?file=$2&dir=$1 [L]
Jedoch würde ich lieber auch zur Sicherheit den vorderen Teil in die RewriteRule aufnehmen. Folgendes funktioniert jedoch leider nicht:
Code:
RewriteCond %{REQUEST_URI} ^/app/(down|up)loads/(.*)$
RewriteRule ^/app/(.+)/(.+)$ /app/download.php?file=$2&folder=$1 [L]
(auch das Weglassen der Zeichen ^ und $ in der RewriteRule hilft nicht).
 

GwenDragon

Registered User
Deine Aufgabenstellung war etwas ungenau. Ich weiß nicht ob du eine .htaccess oder VHost-Konfiguration benutzt. Deswegen habe ich das nur als grobes Beispiel für dich benutzt.

Und was funktioniert jetzt nicht? Welche Meldungen sind im Serverlog? Beschreibe das doch mal.
 
Last edited by a moderator:

danton

Debian User
Code:
RewriteCond %{REQUEST_URI} ^/app/(down|up)loads/(.*)$
RewriteRule ([^/]+)/([^/]+)$ download.php?file=$2&dir=$1 [L]
Jedoch würde ich lieber auch zur Sicherheit den vorderen Teil in die RewriteRule aufnehmen.
Wozu? Durch die Rewrite-Cond wird die Rewrite-Rule doch nur auf URIs ausgeführt, die mit /app/downloads/ oder /app/uploads/ beginnen...
 

raphael123

New Member
Wozu? Durch die Rewrite-Cond wird die Rewrite-Rule doch nur auf URIs ausgeführt, die mit /app/downloads/ oder /app/uploads/ beginnen...
Danke, jetzt hab ich es auch kapiert. Ich hatte noch Verständnis-Probleme, wie das genau funktioniert. Nach dem ich das Log-Level erhört habe (mit "LogLevel alert rewrite:trace3") ist mir das nun endlich richtig klar geworden.

Deine Aufgabenstellung war etwas ungenau. Ich weiß nicht ob du eine .htaccess oder VHost-Konfiguration benutzt. Deswegen habe ich das nur als grobes Beispiel für dich benutzt.

Und was funktioniert jetzt nicht? Welche Meldungen sind im Serverlog? Beschreibe das doch mal.
Ja, stimmt, ich hatte mich da ungenau ausgedrückt. Eigentlich funktioniert alles, ich war nur nicht ganz mit meiner Rule zufrieden, weil wenn man z. B. "/app/uploads/foo/downloads/bar" aufgerufen hätte (was zugegebenermaßen eher nicht vorkommen würde), dann wäre "download.php?file=bar&dir=downloads" aufgerufen worden.
Generell sollte nach dem Dateinamen Schluss sein, und wenn da noch ein "/" kommt, soll das einfach ignoriert werden. Dies habe ich jetzt so gelöst, dass ich das "$" in der Regel weggelassen und dafür noch ein [^/] eingefügt habe:
Code:
RewriteRule ([^/]+)/([^/]+[^/]) download.php?file=$2&dir=$1 [L]
Vielen Dank für Eure Hilfe und die Denkanstöße. Allein durch das Lesen der Doku wäre ich da nicht drauf gekommen. Was mir übrigens auch geholfen hat, war diese Seite: https://htaccess.madewithlove.be/
 

Top