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.
Eine Alternative 'RewriteCond% {DOCUMENT_ROOT} /cache/$1.html -f RewriteRule^([a-z0-9/-] +) $ cache/$ 1.html [L]' – starkeen
@starkeen nicht gültig , DOCUMENT_ROOT ist nicht unser webbasierter Pfad und in jeder Umgebung ist es anders. – Lito