Wie ändere ich mod_rewrite, um {REQUEST_FILENAME} zu vermeiden und so das URL-Limit von 255 Zeichen zu umgehen?

Wie ändere ich mod_rewrite, um {REQUEST_FILENAME} zu vermeiden und so das URL-Limit von 255 Zeichen zu umgehen?

Laut dieser Antwort:Maximale Länge der URL 257 Zeichen für mod_rewrite?Für die Verwendung von mod_rewrite gibt es basierend auf dem Dateisystem eine feste Beschränkung auf maximal 255 Zeichen.

Laut der akzeptierten Antwort gibt es zwei Lösungen:

  1. Ändern Sie das URL-Format Ihrer Anwendung auf 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.

Die erste Methode kann ich nicht anwenden, deshalb versuche ich, die zweite herauszufinden.

Ich habe die Rewrite-Regeln wie gewünscht in die Konfiguration des virtuellen Apache-Hosts eingefügt. Ich kann jedoch nicht herausfinden, wie ich REQUEST_FILENAME entfernen kann und mein Webanwendungsframework (Dragonfly) trotzdem weiterhin 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, aber das zerstört das Framework auf verschiedene Weise. Wie schreibe ich das neu, ohne {REQUEST_FILENAME} zu verwenden?

Antwort1

Die drei folgenden Zeilen weisen Apache an, 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]

Die erste bedeutet „wenn die URI kein Verzeichnis ist“. Die zweite bedeutet „wenn die URI kein Link ist“. Die dritte bedeutet „wenn die URI keine Datei ist“.

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

Die drei Zeilen oben haben einen Zweck. Sie sind da, damit Apache, wenn Sie eine tatsächliche Datei, ein Verzeichnis oder einen symbolischen Link zu Ihrem Dokumentstamm hinzufügen und jemand diese Datei, dieses Verzeichnis oder diesen symbolischen Link anfordert, dies wie gewohnt verarbeitet und die Neuschreibung nicht durchführt. Wenn Sie wissen, dass Sie niemals tatsächliche Dateien zum Dokumentstamm hinzufügen werden, können Sie diese ohne Nebenwirkungen bedenkenlos auskommentieren.


Eine möglicherweise bessere Änderung wäre, über den drei Zeilen eine neue Regel wie diese hinzuzufügen:

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

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

Aktualisieren:

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

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

Antwort2

Folgendes funktioniert bei mir (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]

verwandte Informationen