maksymalna długość url 257 znaków dla mod_rewrite?

12

Mój schemat adresów URL to /foo/var1-var2-var3.../bar

Korzystam z tych reguł mod_rewrite:

RewriteBase /foo/
RewriteEngine on

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

RewriteRule ^ index.php [PT,L]

Jeśli długość ciągu „var1-var2 ...” jest większa niż 257 znaków, zwracany jest błąd 403 Zabronione i 404. Jeśli jednak długość ciągu „var1-var2 ...” wynosi 257 znaków lub mniej, a następnie następuje ukośnik, długość pozostałego adresu URL może być dowolnej długości. Jak pokonać ten limit?

Daniel
źródło

Odpowiedzi:

12

Występują ograniczenia podstawowego systemu plików.

Spójrz na limity systemu plików . Przekonasz się, że większość ma maksymalną długość nazwy pliku 255 bajtów. Dlatego gdy apache i / lub reguła przepisywania sprawdzają, czy plik istnieje, system operacyjny zwraca błąd do apache.

Dzięki Apache, jeśli umieścisz takie zasady w pliku .htaccess, będzie za późno, aby obejść ten problem. Apache będzie już próbował zarejestrować długą nazwę pliku, zgłaszając błąd systemu plików „(36) Nazwa pliku jest zbyt długa”, zwracając błąd 403.

Widzę dwie opcje:

  1. Zmień format adresu URL aplikacji na maksymalnie 255 znaków między każdym ukośnikiem.
  2. Przenieś reguły Przepisz do konfiguracji wirtualnego hosta Apache i usuń REQUEST_FILENAME.
h0tw1r3
źródło
Jeśli plik .htaccess nie zawiera {REQUEST_FILENAME}, ale nadal zwraca wartość 403, czy nadal może to być problem? ( serverfault.com/questions/140852/… )
philfreo
1
Musisz przenieść reguły przepisywania do konfiguracji apache . Jest to jedyny sposób na zachowanie funkcjonalności i obejście problemu.
h0tw1r3
3
Podczas przenoszenia reguł z .htaccess do konfiguracji hosta wirtualnego apache, musisz zmienić %{REQUEST_FILENAME}=>, %{DOCUMENT_ROOT}%{REQUEST_FILENAME}a także dodać ukośnik na początku wzorców adresów URL, np. Nie, RewriteRule ^abc ...ale RewriteRule ^/abc .... Musisz pokochać
prostotę
2
Część „Przenieś reguły przepisywania do konfiguracji wirtualnego hosta Apache” jest złota: w rzeczywistości działa, gdy jest poprawnie zaimplementowana, w przeciwieństwie do wielu innych obejść, które próbowałem.
ash108