Przepisane adresy URL o długości parametru> 255 nie działają

12

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,4bezpoś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.

philfreo
źródło
Czy to może być problem z wyrażeniem regularnym? Czy sprawdziłeś, czy przepisane żądanie jest poprawne dla ciągów dłuższych niż 255 znaków? Jeśli nie, być może mógłbyś opublikować żądania przed i po przepisaniu.
tomjedrz
3
Włącz rejestrowanie za pomocą mod_rewrite RewriteLogi RewriteLogLeveltak 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).
James Sneeringer
Zobacz aktualizację, o której mowa - nic nie jest rejestrowane dla długich parametrów
philfreo

Odpowiedzi:

8

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.

microspino
źródło
Tak, to jest obecnie wszystko, co możemy zrobić, mam jednak nadzieję na obejście lub ulepszenie ustawień.
philfreo
3
Microspino, wygląda na to, że wytniesz i wkleiłeś część swojej odpowiedzi z odpowiedzi @Jeff Clark tutaj: serverfault.com/questions/120397/… . Powinieneś zamieścić link do tej odpowiedzi, aby zyskał rozgłos.
Stefan Lasiewski
@Stefan lasieswski: masz rację, dodałem referencję.
microspino
więc myślisz, że może Apache próbuje zarejestrować żądany plik niezależnie od - to znaczy, to może być jedyny sposób, aby wyjaśnić, że zbyt długi adres URL nie jest nawet pobierany przez silnik przepisywania ...
HorusKol
Tak, to mój pomysł, choć uważam, że z wielu powodów należy unikać tak długich adresów URL i nazw plików. Najlepszą radą, jaką mogłem pomyśleć, jest zmiana czegoś we wzorcu adresu URL, jeśli nazwa pliku nie jest już za długa.
microspino
2

Jest to podobne pytanie na temat tego limitu tutaj :

Być może występują ograniczenia podstawowego systemu plików

Nie wiem, czy używasz REQUEST_FILENAME gdzieś w twojej .htac konfiguracji, więc nie wiem, czy dostarczone rozwiązanie zadziała.

GmonC
źródło
To ma sens, ale nie, nie jestem. Zredagowałem swoje pytanie, aby dołączyć plik .htaccess w całości. Inne pomysły?
philfreo
Według „Apache mod_rewrite Technical Details” na stronie httpd.apache.org/docs/trunk/rewrite/tech.html „Chociaż mod_rewrite przepisuje adresy URL na adresy URL, adresy URL na nazwy plików, a nawet nazwy plików na nazwy plików, interfejs API obecnie zapewnia tylko adres URL do - Nazwa pliku hook. ”. Więc nawet jeśli nie trafiasz do rzeczywistego pliku, może hak URL do nazwy pliku osiąga limit zasobów systemu operacyjnego?
Stefan Lasiewski
0

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.

Oskar Duveborn
źródło
Zobacz aktualizację do pytania. I nie, nie widzę pliku mod_security w /usr/include/apache2/lub /usr/lib/apache2/modules/(ale widzę tam mod_rewrite), więc zakładam, że nie jest zainstalowany.
philfreo