Ich benutze mod_rewrite, um URLs wie diese umzuschreiben:
http://example.com/1,2,3,4/foo/
Auf diese Weise in .htaccess:
RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]
Es funktioniert einwandfrei, außer wenn "1,2,3,4" in eine Zeichenfolge mit mehr als 255 Zeichen umgewandelt wird, gibt Apache "403 Forbidden" zurück.
foo.php?id=1,2,3,4
Selbst mit einer sehr langen ID-Zeichenfolge ist ein direkter Besuch kein Problem. Dies ist jedoch keine Option für mich.
Gibt es Apache oder eine andere Einstellung, die ich anpassen sollte?
UPDATE : Ich habe RewriteLog mit RewriteLogLevel 9 aktiviert. Mit einer kurzen ID-Zeichenfolge werden mehrere Zeilen in meiner Protokolldatei angezeigt. Wenn die ID-Zeichenfolge jedoch größer als 255 Zeichen ist, wird nichts protokolliert (scheint, als würde mod_rewrite nicht einmal ausgeführt?).
Wenn Sie diese Frage interessant / hilfreich finden, stimmen Sie sie bitte hoch.
quelle
RewriteLog
undRewriteLogLevel
Sie können sehen, was abgeglichen wird und wie es tatsächlich umgeschrieben wird. Ich würde vermuten, dass nur 255 Zeichen kopiert werden$1
und dassid
der Client nicht berechtigt ist, diese zu sehen. Apache gibt die 403 zurück. Ich habe mir den Code nicht angesehen, aber es könnte sein, dass Apache manipuliert die Rückreferenz in einem festen 256-Byte-Puffer (der 256. ist für den terminierenden NULL-Wert reserviert).Antworten:
Glauben Sie, Sie stoßen auf eine Einschränkung des Dateisystems?
Möglicherweise beträgt der maximale Dateiname 255 Byte. Wenn Apache oder die mod_rewrite-Regel überprüfen, ob die Datei vorhanden ist, gibt das Betriebssystem einen Fehler an Apache zurück.
Wenn Sie eine Regel in Ihre .htaccess-Datei einfügen, ist es zu spät, um das Problem zu umgehen. Apache hat bereits versucht, den Dateinamen und den ausgelösten Dateisystemfehler '(36) Dateiname zu lang' zu ermitteln und einen 403-Fehler zurückgegeben.
Möglicherweise können Sie das URL-Muster in Ihrer App ändern. bis zu 255 Zeichen von Schrägstrich zu Schrägstrich.
BEARBEITEN: Hier finden Sie eine ausführliche Antwort auf dieses Problem. Ich habe meine von dort ausgeliehen.
quelle
Es gibt eine ähnliche Frage zu diesem Limit hier :
Ich weiß nicht, ob Sie REQUEST_FILENAME irgendwo in Ihrer .htaccess-Konfiguration verwenden. Sie wissen also nicht, ob die bereitgestellte Lösung funktionieren wird.
quelle
Auf jeden Fall eine interessante Frage. Führen Sie mod_security aus und versuchen Sie es, wenn ja, ohne es? Vielleicht mag es einfach keine langen Pfadnamen oder langen Pfadnamen mit nicht kodierten Kommas? ^^
Obwohl es sich instinktiv eher wie eine Beschränkung des URL-Pfads oder zumindest einzelner Segmente davon oder der zugrunde liegenden Dateisysteminterpretation davon anfühlt, wie GmonC es geschrieben hat. Das würde auch erklären, warum die reguläre URL mit dem langen Teil in der Abfragezeichenfolge gut funktioniert.
Ich denke, dass ältere ASP.NET verwendet, um eine Anforderungspfadbegrenzung von ~ 260 Zeichen oder etwas zu haben.
quelle
/usr/include/apache2/
oder/usr/lib/apache2/modules/
(aber ich sehe dort mod_rewrite), also gehe ich davon aus, dass sie nicht installiert ist.Sind Sie bereit, http-Server zu ändern? Betrachten Sie dann Nginx anstelle von Apache.
Und benutze http://wiki.nginx.org/NginxHttpRewriteModule
quelle