Ich habe die Entwicklung einer ziemlich starken LAMP-Anwendung übernommen. Der ursprüngliche Entwickler verwendete eine .htaccess-Datei mit RewriteMap und ein PHP-Skript, um bestimmte Bedingungen der App zu behandeln.
Wenn bestimmte Subdomänenmuster vom Client angefordert werden, fängt die RewriteMap sie ab und sendet sie an das entsprechende Anwendungsmodul.
Ich fühle mich ziemlich wohl mit typischen mod_rewrite-Weiterleitungen, und ich denke, ich habe das grundlegende RewriteMap-Konzept herausgefunden; aber ich habe Mühe, eine anständige Dokumentation darüber zu finden, wie RewriteLock funktioniert. Laut den Apache-Dokumenten:
Diese Anweisung legt den Dateinamen für eine Synchronisationssperrdatei fest, die mod_rewrite mit RewriteMap-Programmen kommunizieren muss. Setzen Sie diese Sperrdatei auf einen lokalen Pfad (nicht auf einem NFS-Mounted-Gerät), wenn Sie ein Rewriting-Map-Programm verwenden möchten. Es ist nicht für andere Arten des Umschreibens von Karten erforderlich.
Aber das ist immer noch ein bisschen vage für mich. Was ist der genaue Zweck und die Funktion von RewriteLock und wie funktioniert es?
RewriteLock wird mit dem Schlüsselwort prg:
verwendet. RewriteMap kann mit mehreren Schlüsselwörtern verwendet werden, um Textdateien ( txt:
), Hashdateien ( dbm:
), randomisierten Text ( rnd:
) oder externe Mapping-Skripte (das ist% co_de) zu verwenden % Stichwort ). In diesem Modus wird das externe Skript gestartet, wenn Apache gestartet wird. Dann, wenn mod-rewrite das prg:
Mapping aufruft, sendet apache für jede eingehende Anfrage eine Eingabe an dieses Skript und liest den Ausgabestrom, um den Wert zu erhalten.
RewriteLock muss in diesem Fall verwendet werden, um parallele Anfragen zu verhindern (also parallele Eingaben zu diesem externen Prozess), um Antworten auf diese Prozessstandardausgabe zu mischen. Es ist ein Sperrmechanismus (eine Datei, der angegebene Pfad, der ein klassisches Token ist, nur ein Benutzer), um die Serialisierung der Aufrufe dieses externen Zuordnungsskripts zu erzwingen. IMHO sollte es transparent durch mod-rewrite bei der Verwendung von prg: angewendet werden, da ich nie einen PRG-Fall gefunden habe, in dem diese Sperrung nicht obligatorisch ist .
Bearbeiten:
Nun, eigentlich könnte man ein externes prg verwenden: ohne rewriteLock, wenn die Randomisierung der Ausgabe kein Problem ist, dh für einen gegebenen Eintrag kann man eine Antwort bekommen, die für einen anderen Eintrag gegeben wurde, wie in einem fortgeschrittenen Skript rnd :, Ihr eigener Round-Robin-Service. Aber wenn die Ausgabe den Eintrag widerspiegeln muss, dann brauchen Sie diesen Semaphor, was natürlich den Rewritemap-Prozess verlangsamen kann.
Wenn Sie also nur die Hashmap oder Textmap verwenden, brauchen Sie das RewriteLock nicht zu setzen.
Bearbeiten:
Sie finden möglicherweise nützliche Details zu diesem Thread , wie die Tatsache, dass die Sperrdatei nur für ein paar Millisekunden existiert , wenn Apache das Prg aufruft und auf eine Antwort wartet.
Bearbeiten: Auf die Frage eine seltsame Tatsache ist:
Der ursprüngliche Entwickler hat eine .htaccess Datei mit RewriteMap
verwendet
Das ist seltsam, weil RewriteMap nicht mit .htaccess-Dateien arbeiten kann, .htaccess sind Konfigurationseinträge, die dynamisch gelesen werden und RewriteMap wie angegeben hier in der Kontext Zeile kann nur in der Hauptkonfiguration oder in einer VirtualHost-Konfiguration festgelegt werden. Es kann sich nicht an einem Ort, einem Verzeichnis oder einem .htaccess befinden. Es besteht also die Möglichkeit, dass dies in einem .htaccess nie funktioniert.
Nun hat @puk nach einem Beispiel für die Verwendung von RewriteMap gefragt. Nun, die Suche nach "RewriteMap" im Stack-Überlauf zeigt Ihnen einige reale Beispiele:
Apache hängt, wenn Sie mehr als eine RewriteLock-Direktive definieren oder wenn Sie es in einer VHOST-Konfiguration verwenden.
Der RewriteLock sollte auf Serverkonfigurationsebene und NUR EINMAL angegeben werden. Diese Sperrdatei wird von allen Karten vom Typ prg verwendet. Wenn Sie also mehrere PRG-Maps verwenden wollen, schlage ich vor, einen internen Sperrmechanismus zu verwenden, zum Beispiel in PHP gibt es die Flock-Funktion, und ignorieren Sie einfach die Warnung, die Apache in das Fehlerprotokoll schreibt.
Siehe hier für weitere Informationen: Ссылка
Tags und Links apache mod-rewrite lamp