Używam mod_rewrite do przepisywania adresów URL w następujący sposób:
http://example.com/1,2,3,4/foo/
Robiąc to w .htaccess:
RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]
Działa dobrze, z wyjątkiem sytuacji, gdy „1,2,3,4” zamienia się w ciąg dłuższy niż 255 znaków, Apache zwraca „403 Forbidden”.
Nie ma problemu z foo.php?id=1,2,3,4
bezpośrednim odwiedzeniem , nawet przy bardzo długim ciągu id, jednak nie jest to dla mnie opcja.
Czy jest jakieś ustawienie Apache lub innego ustawienia, które powinienem dostosować?
AKTUALIZACJA : Włączyłem RewriteLog za pomocą RewriteLogLevel 9. Z krótkim ciągiem id otrzymuję kilka wierszy w moim pliku dziennika. Ale gdy ciąg id jest większy niż 255 znaków., Nic nie jest rejestrowane (wydaje się, że mod_rewrite nawet nie wykonuje?).
Jeśli uznasz to pytanie za interesujące / pomocne, oceń je.
apache-2.2
mod-rewrite
url
querystring
philfreo
źródło
źródło
RewriteLog
iRewriteLogLevel
tak można zobaczyć, co jest dopasowane i jak to naprawdę jest przepisany. Domyślam się, że kopiowane są tylko 255 znaków$1
, co kończy się tym,id
że klient nie jest upoważniony do ich przeglądania, więc Apache zwraca 403. Nie spojrzałem na kod, ale możliwe, że Apache manipuluje odwołanie wsteczne w stałym 256-bajtowym buforze (256-ty jest zarezerwowany dla kończącej wartości NULL).Odpowiedzi:
Czy uważasz, że masz problem z systemem plików?
Maksymalna długość pliku może wynosić 255 bajtów, a gdy apache lub reguła mod_rewrite sprawdzą, czy plik istnieje, system operacyjny zwraca błąd do apache.
Jeśli umieścisz jakąś regułę w pliku .htaccess, będzie za późno, aby obejść ten problem. Apache próbował już zarejestrować nazwę pliku i zgłosił błąd systemu plików „(36) Nazwa pliku za długa”, zwracając błąd 403.
Może możesz zmienić wzorzec adresu URL w swojej aplikacji. do maksymalnie 255 znaków od ukośnika do ukośnika.
EDYCJA: poszukaj tutaj szczegółowej odpowiedzi na ten problem. Pożyczyłem mój stamtąd.
źródło
Jest to podobne pytanie na temat tego limitu tutaj :
Nie wiem, czy używasz REQUEST_FILENAME gdzieś w twojej .htac konfiguracji, więc nie wiem, czy dostarczone rozwiązanie zadziała.
źródło
Zdecydowanie interesujące pytanie. Czy korzystasz z mod_security, a jeśli tak, próbujesz bez niego? Być może po prostu nie lubi długich nazw ścieżek lub długich nazw ścieżek z niekodowanymi przecinkami? ^^
Chociaż instynktownie wydaje się bardziej ograniczeniem ścieżki adresu URL lub przynajmniej jej poszczególnych segmentów lub interpretacji systemu plików, jak napisał GmonC. To by również wyjaśniało, dlaczego zwykły adres URL z długą częścią w ciągu zapytania działa dobrze.
Myślę, że starszy ASP.NET miał limit ścieżki żądania ~ 260 znaków lub coś podobnego.
źródło
/usr/include/apache2/
lub/usr/lib/apache2/modules/
(ale widzę tam mod_rewrite), więc zakładam, że nie jest zainstalowany.Czy chcesz zmienić serwery HTTP? Rozważ wtedy nginx zamiast apache.
I użyj http://wiki.nginx.org/NginxHttpRewriteModule
źródło