Nabraham: .htaccess - Prüfen, ob Datei existiert

Beitrag lesen

ich habe zwei Verzeichnisse, /dateien/ und /dateien/veraltet/.
  Jetzt möchte ich das wenn ein Anfrage kommt er schaut ob die Datei dem ersten Verzeichnis ist und wenn ja dann soll er dahin weiterleiten, falls nein das gleich beim zweiten Verzeichnis.
  Wenn die Angeforderte Datei in beiden Verzeichnissen nicht existiert soll ein 404 ausgegeben werden.

Momentan sieht mein code so aus:
RewriteRule ^download/([a-z0-9_]+)(/|\s*)$ http://domain.de/dateien/$1.zip
RewriteRule ^history/([a-z0-9_]+)(/|\s*)$ http://domain.de/dateien/veraltet/$1.zip

Die Aufgabe erscheint auf den ersten Blick etwas vertrackt, sollte aber letztenendes recht einfach zu lösen sein. Wie Du schon gesehen hast, kann RewriteCond  mittels -f prüfen, ob es sich beim gegebenen Datum um eine Datei handelt. Wenn Du nochmal ein paar Absätze weiter oben schaust, wirst Du auf Folgendes stoßen:

"TestString" is a string which can contain the following expanded constructs in addition to plain text:
* RewriteRule backreferences: These are backreferences of the form $N  (0 <= N <= 9), which provide access to the grouped parts (in parentheses) of the pattern, from the RewriteRule which is subject to the current set of RewriteCond conditions.

RewriteCond kann also mittels $0 bis $9 auf die in runden Klammern stehenden Teile der dazu gehörenden RewriteRule-Anweisung zugreifen und daraus das zu prüfende Datum erzeugen.
Ein Prüf-Block besteht immer aus einer Anzahl RewriteCond-Zeilen, gefolgt von einer RewriteRule-Zeile. Allerdings wird immer das RewriteRule-Muster zuerst geprüft, bei einem Treffer folgen dann alle (davor stehenden) RewriteCond-Muster und abschließend wird die RewriteRule-Umformung ausgeführt (so noch alles passt). Deshalb kann RewriteCond auf das RewriteRule-Muster bzw. dessen Ergebnis zugreifen.

Deine Aufgabe lässt sich daher erfüllen, indem Du einfach die Variable $1 auch in der RewriteCond-Zeile nutzt:

RewriteCond /dateisystempfad/zu/dateien/$1.zip -f
RewriteRule ^download/([a-z0-9_]+)(/|\s*)$ /dateien/$1.zip [L]

RewriteCond /dateisystempfad/zu/dateien/veraltet/$1.zip -f
RewriteRule ^history/([a-z0-9_]+)(/|\s*)$ /dateien/veraltet/$1.zip [L]

(Die 404-Fehlermeldung kommt ab hier automatisch.)

Für RewriteCond muss der vollständige Pfad im Dateisystem des Servers angeben werden, nicht nur jener im aktuellen Verzeichnis oder wie Du ihn in der URL siehst. Du bekommst diesen Pfad mit folgendem Eintrag in der .htaccess leicht angezeigt:

RewriteRule pfad ?%{REQUEST_FILENAME} [R]

Rufe im Browser "pfad" auf und in der Adressleiste sollte "?/dateisystempfad/zu/aktuellem/verzeichnis/bla" erscheinen.

Der http://-Vorsatz bei RewriteRule wird übrigens nur gebraucht, falls das Ziel auf einem anderen Server liegt.