maximale Länge von URL 257 Zeichen für mod_rewrite?

11

Mein URL-Schema lautet /foo/var1-var2-var3.../bar

Ich verwende diese mod_rewrite-Regeln:

RewriteBase /foo/
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^ index.php [PT,L]

Wenn die Länge der Zeichenfolge 'var1-var2 ...' größer als 257 Zeichen ist, werden ein Fehler 403 Forbidden und ein Fehler 404 zurückgegeben. Wenn die Länge der Zeichenfolge 'var1-var2 ...' jedoch 257 Zeichen oder weniger beträgt und anschließend ein Schrägstrich folgt, kann die Länge der verbleibenden URL beliebig lang sein. Wie überwindet man diese Grenze?

Daniel
quelle

Antworten:

11

Sie stoßen auf eine Einschränkung des zugrunde liegenden Dateisystems.

Schauen Sie sich die Dateisystemgrenzen an . Sie werden sehen, dass die meisten eine maximale Dateinamenlänge von 255 Bytes haben. Wenn also Apache und / oder Ihre Umschreiberegel prüfen, ob die Datei vorhanden ist, wird vom Betriebssystem ein Fehler an Apache zurückgegeben.

Wenn Sie mit Apache Regeln wie diese in die .htaccess-Datei einfügen, ist es zu spät, um das Problem zu umgehen. Apache hat bereits versucht, den langen Dateinamen anzugeben, wodurch der Dateisystemfehler '(36) Dateiname zu lang' ausgelöst wurde und ein 403-Fehler zurückgegeben wurde.

Ich sehe zwei Möglichkeiten:

  1. Ändern Sie das URL-Format Ihrer Anwendung auf maximal 255 Zeichen zwischen den einzelnen Schrägstrichen.
  2. Verschieben Sie die Rewrite-Regeln in die Konfiguration des virtuellen Apache-Hosts und entfernen Sie den REQUEST_FILENAME.
h0tw1r3
quelle
Wenn eine .htaccess-Datei nicht {REQUEST_FILENAME} enthält, aber dennoch eine 403 zurückgibt, könnte dies immer noch das Problem sein? ( serverfault.com/questions/140852/… )
Philfreo
1
Sie müssen die Umschreiberegeln in die Apache-Konfiguration verschieben . Dies ist die einzige Möglichkeit, die Funktionalität beizubehalten und das Problem zu umgehen.
h0tw1r3
3
Wenn Sie Regeln von .htaccess in die Konfiguration des virtuellen Apache-Hosts verschieben, müssen Sie %{REQUEST_FILENAME}=> ändern %{DOCUMENT_ROOT}%{REQUEST_FILENAME}und am Anfang Ihrer URL-Muster einen Schrägstrich hinzufügen, z . B. RewriteRule ^abc ...aber nicht RewriteRule ^/abc .... Du musst die
Unkompliziertheit
2
Der Teil "Verschieben der Rewrite-Regeln in die Konfiguration des virtuellen Apache-Hosts" ist golden: Er funktioniert tatsächlich, wenn er ordnungsgemäß implementiert wird, im Gegensatz zu vielen anderen Problemumgehungen, die ich versucht habe.
ash108