Dlaczego znak procentu w adresie URL powoduje błąd nieprawidłowego żądania HTTP 400?

22

Natknąłem się na to przypadkowo, gdy błędnie wpisałem adres URL strony internetowej w przeglądarce.

Dlaczego odwiedziny http://example.com/%powodują zgłoszenie błędu nieprawidłowego żądania HTTP 400? Czy serwer oczekuje czegoś innego po znaku procentu lub przed nim?

Wydaje się, że dzieje się tak w przypadku serwerów Apache i Nginx.

iglvzx
źródło

Odpowiedzi:

32

Krótka odpowiedź

Zgodnie z RFC 3986 , pusty %znak nie jest prawidłową składnią URI ; po nim powinny następować dwie znaczące cyfry szesnastkowe .

Długa odpowiedź

Otrzymany kod statusu HTTP należy do 4xxklasy:

4xx: Client Error - The request contains bad syntax or cannot be fulfilled

Źródło: Rejestr kodów statusu protokołu HTTP (Hypertext Transfer Protocol)

W szczególności kod 400jest zdefiniowany przez Internet Engineering Task Force (IETF) w RFC 2616:

10.4.1 400 Zła prośba

Serwer nie mógł zrozumieć żądania z powodu nieprawidłowej składni. Klient NIE POWINIEN powtarzać żądania bez modyfikacji.

Źródło: RFC 2616 - Hypertext Transfer Protocol - HTTP / 1.1

Cytując Wikipedię (moje odważne podkreślenie):

Znaki dozwolone w URI są albo zastrzeżone lub niezarezerwowany ( lub procent postać w ramach procent kodowania ).

Źródło: Kodowanie procentowe - Kodowanie procentowe w URI

Jeśli chcesz wstawić literalnego %symbolu, należy użyć jego procentowy zakodowanych reprezentacji: %25.

Dalsza lektura

i31415
źródło
Nie rozumiem Jeśli maskuję znak „%” za pomocą „% 25”, plik nadal nie będzie obsługiwany, ale w naszym scenariuszu zostanie zgłoszony błąd 400 (Apache -> JKMount -> Tomcat)
fiffy
Jeśli masz. RewriteRule RewriteRule (.*) xyz/$1(gdzie xyz to dowolna nazwa folderu) w .htaccess, powinieneś dwukrotnie kodować% jako% 2525.
Marco Marsala
9

Znak procentu służy do wstawienia znaku, który zwykle nie jest obsługiwany w adresie URL. Na przykład% 20 jest taki sam jak spacja.

LPChip
źródło
4
I wstawić sam znak procentowy, to%25
Robotnik
A +to skrót do kodowania spacji. Jeśli chcesz prawdziwy znak plus, użyj jego kodu szesnastkowego,% 2B.
Phil Perry
3
+ to poprawne kodowanie spacji tylko w ciągu zapytania. % 20 to poprawne kodowanie w innym miejscu adresu URL.
Eden Townsend