fragen stichworte

Wie kann man mod_rewrite ändern, um {REQUEST_FILENAME} zu vermeiden, um ein URL-Limit von 255 Zeichen zu erreichen?

Gemäß dieser Antwort: maximale Länge der URL 257 Zeichen für mod_rewrite? Es gibt eine maximale Begrenzung von 255 Zeichen, basierend auf dem Dateisystem für die Verwendung von mod_rewrite.

Entsprechend der akzeptierten Antwort gibt es zwei Lösungen:

  1. Ändern Sie das URL-Format Ihrer Anwendung in maximal 255 Zeichen zwischen jedem Schrägstrich.
  2. Verschieben Sie die Rewrite-Regeln in die Konfiguration des virtuellen Apache-Hosts und entfernen Sie REQUEST_FILENAME.

Ich kann die erste Methode nicht verwenden, also versuche ich, die zweite Methode herauszufinden.

Ich habe die Rewrite-Regeln wie gewünscht in die virtuelle Konfiguration des Apache-Hosts eingefügt. Ich kann jedoch nicht herausfinden, wie ich REQUEST_FILENAME entfernen kann und trotzdem immer noch mein Webanwendungs-Framework (Dragonfly) funktioniert.

Hier ist der Teil der Umschreiberegeln, den ich von .htaccess in die virtuelle Host-Konfigurationsdatei von Apache verschoben habe:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]

# if don't want Dragonfly to process html files comment
# out the line below (you may need to remove the [OR] above too).
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$

# Main URL rewriting.
RewriteRule (.*) index.cgi?$1 [L,QSA]

Ich habe versucht, {REQUEST_FILENAME} zu entfernen, und das Framework wird auf verschiedene Weise gebrochen. Wie schreibe ich das um, ohne {REQUEST_FILENAME} zu verwenden?

antworten

In den drei folgenden Zeilen wird Apache angewiesen, das Dateisystem zu überprüfen, um festzustellen, ob die Datei vorhanden ist.

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]

Der erste bedeutet "wenn der URI kein Verzeichnis ist". Die zweite bedeutet "wenn der URI keine Verbindung ist". Der dritte bedeutet "wenn der URI keine Datei ist".

Wenn Sie diese Zeilen entfernen oder auskommentieren, wendet Apache die unten stehende Umschreibung auf jede Datei an, die nicht auf ".html" oder ".nl" endet, und überprüft das Dateisystem nicht, um festzustellen, ob die Datei zuerst vorhanden ist .

Die drei obigen Zeilen haben einen Zweck. Wenn Sie eine tatsächliche Datei, ein Verzeichnis oder ein Symlink zu Ihrem Dokumentstammverzeichnis hinzufügen und jemand diese Datei, das Verzeichnis oder das Symlink anfordert, verarbeitet Apache diese Datei wie gewohnt und nicht das Umschreiben. Wenn Sie wissen, dass Sie niemals tatsächliche Dateien in das Dokumentstammverzeichnis einfügen, können Sie diese sicher und ohne Nebeneffekte auskommentieren.


Eine möglicherweise bessere Änderung wäre das Hinzufügen einer neuen Regel über den drei Zeilen wie folgt:

RewriteRule (.*[^/]{255}.*) index.cgi?$1 [L,QSA]

Dadurch werden alle URIs abgefangen, die eine einzige Zeichenfolge mit mehr als 255 Zeichen zwischen den Schrägstrichen haben, und sie direkt an das Umschreiben senden, ohne das Dateisystem zu überprüfen. Die Option [L] stellt sicher, dass Apache keine weiteren Regeln prüft, wenn diese mit diesen übereinstimmen. Es besteht keine Gefahr des Abfangens von URIs, die tatsächlichen Dateien zugeordnet worden wären, da URIs, die diesem regulären Ausdruck entsprechen, keine gültigen Dateipfade sind.

Update:

Ein regulärer Ausdruck, der mit jedem URI übereinstimmt, der mindestens 255 Zeichen lang ist.

RewriteRule (.{255}) index.cgi?$1 [L,QSA]

Folgendes funktioniert für mich (getestet im Standard-Virtualhost unter Debian mit Apache 2.2.21).

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} (.{255}) [OR]
RewriteCond %{REQUEST_FILENAME} \\.(html|nl)$ [OR]
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_FILENAME} !-l [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*)/index.cgi?$1 [L,QSA]