2009-01-22 4 views
14

Wie können Sie mit ModRewrite überprüfen, ob eine Cachedatei vorhanden ist, und wenn dies der Fall ist, in die Cachedatei umschreiben und andernfalls in eine dynamische Datei umschreiben.RewriteRule-Überprüfungsdatei im Rewrizen-Dateipfad existiert

Zum Beispiel habe ich die folgende Ordnerstruktur:

 
pages.php 
cache/ 
    pages/ 
    1.html 
    2.html 
    textToo.html 
    etc. 

Wie würden Sie Setup die RewriteRules für diese so Anfrage kann wie folgt gesendet werden:

 
example.com/pages/1 

Und wenn der Cache-Datei vorhanden ist Rewrite Vervollständigen Sie die Cachedatei, und wenn die Cachedatei nicht existiert, schreiben Sie sie in pages.php? p = 1

. Es sollte in etwa so aussehen: Ich habe dies nicht gefragt)

 
RewriteRule ^pages/([^/\.]+) cache/pages/$1.html [NC,QSA] 
RewriteCond %{REQUEST_FILENAME} -f [NC,OR] 
RewriteCond %{REQUEST_FILENAME} -d [NC] 
RewriteRule cache/pages/([^/\.]+).html pages.php?p=$1 [NC,QSA,L] 

Ich kann aus dieser mit PHP grob tun, aber ich dachte, es möglich sein mußte mod_rewrite.

Antwort

17
RewriteRule ^pages/([^/\.]+) cache/pages/$1.html [NC,QSA] 

# At this point, we would have already re-written pages/4 to cache/pages/4.html 
RewriteCond %{REQUEST_FILENAME} !-f 

# If the above RewriteCond succeeded, we don't have a cache, so rewrite to 
# the pages.php URI, otherwise we fall off the end and go with the 
# cache/pages/4.html 
RewriteRule ^cache/pages/([^/\.]+).html pages.php?p=$1 [NC,QSA,L] 

Das Ausschalten von MultiViews ist ebenfalls wichtig (wenn Sie sie aktiviert haben).

Options -MultiViews 

Andernfalls wird die ursprüngliche Anforderung (/ pages/...) erhalten werden automatisch in /pages.php vor mod_rewrite Tritte umgewandelt. Sie können auch nur pages.php etwas umbenennen andere (und aktualisieren Sie die letzte Rewrite Regel), um den MultiViews-Konflikt zu vermeiden.

Edit: Ich habe zunächst RewriteCond ... !-d aufgenommen, aber es ist von außen.

5

würde Ein weiterer Ansatz aussehen, zuerst, wenn es eine chached Darstellung verfügbar:

RewriteCond %{DOCUMENT_ROOT}/cache/$0 -f 
RewriteRule ^pages/[^/\.]+$ cache/$0.html [L,QSA] 

RewriteRule ^pages/([^/\.]+)$ pages.php?p=$1 [L,QSA] 
Verwandte Themen