2016-05-08 6 views
-1

Ich arbeite in einem einfachen Cache-System von PHP generiert und reagierte von Apache .htaccess (und in realen Server von Nginx).Wiederherstellen einer zwischengespeicherten Datei von .htaccess

PHP erstellt die Cache-Datei in public/cache/ mit Dateien wie public/cache/post/35/my-first-post.html

Virtual ist für alle Projekte gemeinsam, wir entwickeln keine Virtualhost für jedes Projekt:

<VirtualHost *:80> 
    DocumentRoot /var/www 

    <Directory /var/www> 
     Options -Indexes 
     AllowOverride All 
     Require all granted 
    </Directory> 
</VirtualHost> 

.htaccess in /var/www/projects/current-project/public/.htaccess befindet sollte Ermitteln Sie diese Cache-Datei und geben Sie sie zurück.

DirectoryIndex index.php 

<IfModule mod_rewrite.c> 
    Options -MultiViews 

    RewriteEngine On 

    RewriteCond cache/$1.html -f 
    RewriteRule ^([a-z0-9/-]+)$ cache/$1.html [L] 

    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule^index.php [L] 
</IfModule> 

URL ist http://localhost/projects/current-project/public/post/35/my-first-post aber Produktionsserver ist http://domain.com/post/35/my-first-post

und schreiben log:

[Sun May 08 13:55:11.236124 2016] [rewrite:trace4] [pid 3189] mod_rewrite.c(476): [client 127.0.0.1:43494] 127.0.0.1 - - [localhost/sid#7f2d26745ae0][rid#7f2d2668e0a0/initial] [perdir /var/www/projects/current-project/public/] RewriteCond: input='cache/post/1/my-first-post.html' pattern='-f' => not-matched 

Datei perdir /var/www/projects/current-project/public/ + input='cache/post/1/my-first-post.html' = /var/www/projects/current-project/public/cache/post/1/my-first-post.html existiert.

Ich möchte keine RewriteBase festlegen, weil für jede Entwicklungsumgebung dynamisch ist.

Wie kann ich die Cache-Datei aus aktuellen .htaccess Ordner erkennen?

Arbeits nginx Version:

set $cachefile ""; 

if ($uri ~ ^[a-z0-9/-]+$) { 
    set $cachefile "/cache/$uri.html"; 
} 

if ($uri = "/") { 
    set $cachefile "/cache/index.html"; 
} 

location/{ 
    try_files $cachefile $uri $uri/ /index.php?$query_string; 
} 

Arbeitslösung dank @ Sumurai8:

DirectoryIndex index.php 

<IfModule mod_rewrite.c> 
    Options -MultiViews 

    RewriteEngine On 

    # Redirect Trailing Slashes If Not A Folder... 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)/$ /$1 [L,R=301] 

    # No request: index cache 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond $1#%{REQUEST_FILENAME} ^/?#(.*/public)/ 
    RewriteCond %1/cache/index.html -f 
    RewriteRule ^$ cache/index.html [L,NC] 

    # Request: page 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond $1#%{REQUEST_FILENAME} ^([a-z0-9/-]+)#(.*/public)/ 
    RewriteCond %2/cache/%1.html -f 
    RewriteRule ^([a-z0-9/-]+)$ cache/$1.html [L,NC] 

    # Catch all script and cache generator 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule^index.php [L] 
</IfModule> 

Dank.

+0

Eine Alternative 'RewriteCond% {DOCUMENT_ROOT} /cache/$1.html -f RewriteRule^([a-z0-9/-] +) $ cache/$ 1.html [L]' – starkeen

+0

@starkeen nicht gültig , DOCUMENT_ROOT ist nicht unser webbasierter Pfad und in jeder Umgebung ist es anders. – Lito

Antwort

2

Die -f und andere ähnliche Überprüfungen arbeiten an Dateinamen, nicht urls. Sie sollten zuerst auf %{REQUEST_FILENAME} übereinstimmen, dann erstellen Sie Ihren eigenen Dateinamen.

RewriteCond $1#%{REQUEST_FILENAME} ^([a-z0-9/-]+)#(.*/public)/ 
RewriteCond %2/cache/%1.html -f 
RewriteRule ^([a-z0-9/-]+)$ cache/$1.html [L] 

($1 ist der erste Fang-Gruppe der Regel, die den letzten Teil der zwischengespeicherten Datei enthält. In der zweiten Bedingung %2 ist die zweite Einfanggruppe der vorherigen Zustand, der das Dokument Wurzel enthält + . Strom Präfix)

Alternativ können Sie blind in den Cache neu zu schreiben, und schreiben Sie wieder, wenn der Cache nicht existiert:

RewriteCond %{REQUEST_URI} !^/cache/ 
RewriteRule ^([a-z0-9/-]+)$ cache/$1.html [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^index.php [L] 

In Ihrem Fall index.php müssten erkennen die Cache-URL, die möglicherweise problematisch ist.

+0

Getestet mit: RewriteCond% {REQUEST_FILENAME}^(. */Public)/([a-z0-9/-] +) $ RewriteCond% 1/Cache /% 2.html -f RewriteRule^([a-z0-9/-] +) $ cache/1.html $ [L] Log ist: [Sun 8. Mai 14: 49: 33,922789 2016] [umschreiben: trace4] [pid 4206] mod_rewrite.c (476): [Client 127.0.0.1:44666] 127.0.0.1 - - [localhost/sid # 7f2d26745ae0] [los # 7f2d266820a0/initial] [perdir/var/www/public /] RewriteCond: input = '/ var/www/public/cache/post.html' pattern = '- f' => nicht übereinstimmend, Referer: http: // localhost/public/ – Lito

+1

Hrmmmm ... diese Variable ist immer ein bisschen gut . Lass mich versuchen, es ein bisschen zu ändern. – Sumurai8

+0

Hauptproblem in Ihrer Lösung ist, dass REQUEST_URI nicht aus dem Projektpfad stammt, aus DOCUMENT_ROOT stammt und jeder Entwickler sein eigenes DOCUMENT_ROOT hat (http: // localhost/projects/aktuelles-projekt/public/post/35/mein-first-post oder http: //project.localhost/post/35/my-first-post oder sonstwo). Wie auch immer, danke für deinen Kommentar. – Lito