Czy adres URL może zawierać spację?

Czy identyfikator URI (w szczególności adres URL HTTP) może zawierać jeden lub więcej znaków spacji? Jeśli adres URL musi być zakodowany, czy + jest tylko powszechnie przestrzeganą konwencją, czy uzasadnioną alternatywą?

W szczególności czy ktoś może wskazać dokument RFC wskazujący, że adres URL ze spacją musi być zakodowany?

Motywacja do pytania: Podczas beta-testów witryny internetowej zauważyłem, że niektóre adresy URL zawierały spacje. Wyglądało na to, że Firefox postąpił słusznie, co mnie zaskoczyło! Chciałem jednak móc wskazać programistom dokument RFC, aby poczuli potrzebę poprawienia tych adresów URL.


person Joe Casadonte    schedule 31.01.2009    source źródło
comment
nadzbiór, który pojawił się później: jakie są wszystkie nieprawidłowe znaki: stackoverflow.com/questions/1547899/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 29.08.2014
comment
Powiązane: Czy w adresie URL spacje powinny być kodowane za pomocą %20 czy +?   -  person DavidRR    schedule 17.09.2014


Odpowiedzi (10)


Zgodnie z RFC 1738:

Niebezpieczny:

Postacie mogą być niebezpieczne z wielu powodów. Znak spacji jest niebezpieczny, ponieważ znaczące spacje mogą zniknąć, a nieistotne spacje mogą zostać wprowadzone podczas transkrypcji lub składania adresów URL lub poddawania ich obróbce w programach do edycji tekstu. Znaki "<" i ">" są niebezpieczne, ponieważ są używany jako ogranicznik wokół adresów URL w wolnym tekście; w niektórych systemach cudzysłów (""") służy do oddzielania adresów URL. Znak "#" jest niebezpieczny i powinien być zawsze kodowany, ponieważ jest używany w sieci WWW i innych systemach do oddzielania adresu URL od identyfikatora fragmentu/kotwicy, który może po nim następować. Znak "%" jest niebezpieczny, ponieważ jest używany do kodowania innych znaków. Inne znaki są niebezpieczne, ponieważ bramy i inni agenci transportowi czasami modyfikują takie znaki. Te znaki to "{", "}", "|", "\", "^", "~", "[", "]" i "`".

Wszystkie niebezpieczne znaki muszą być zawsze zakodowane w adresie URL. Na przykład znak "#" musi być zakodowany w adresach URL nawet w systemach, które normalnie nie obsługują identyfikatorów fragmentów lub kotwic, tak aby w przypadku skopiowania adresu URL do innego systemu, który ich używa, nie była konieczna zmiana kodowania adresu URL .

person Marc Novakowski    schedule 31.01.2009
comment
1738 został zastąpiony przez 2396. ietf.org/rfc/rfc2396.txt To znaczy bieżąca specyfikacja Uri. Nie ma to jednak znaczenia w tym przypadku. - person Steve Severance; 31.01.2009
comment
A numer 2396 został zastąpiony przez numer 3986. Wiele osób myli się, ponieważ dokumenty RFC są niezmienne i dlatego nie mówią czytelnikowi, że są przestarzałe. Wskazówka: użyj tools.ietf.org/html/rfcnnnn, na przykład tools.ietf.org/html/rfc2396 zamiast tego wyświetla brakujące metadane na górze. - person Julian Reschke; 01.02.2009

Dlaczego trzeba to kodować? Żądanie wygląda następująco:

GET /url HTTP/1.1
(Ignoring headers)

Istnieją 3 pola oddzielone białą spacją. Jeśli wstawisz spację w adresie URL:

GET /url end_url HTTP/1.1

Wiesz, że masz 4 pola, serwer HTTP poinformuje Cię, że jest to nieprawidłowe żądanie.

GET /url%20end_url HTTP/1.1

3 pola => ważne

Uwaga: w ciągu zapytania (po?) spacja jest zwykle kodowana jako +

GET /url?var=foo+bar HTTP/1.1 

zamiast

GET /url?var=foo%20bar HTTP/1.1 
person Julien    schedule 31.01.2009
comment
Co by było, gdyby var naprawdę był foo+bar, a nie foo bar? - person Ivo3185; 11.09.2015
comment
Twierdzę, że jest to wymóg warstwy transportowej, a nie samej specyfikacji URI. GET jest wyraźnie właściwością specyfikacji http:, a nie specyfikacji adresu URL. Podobnie można argumentować, że cytaty w adresach URL muszą być zakodowane, ponieważ w przeciwnym razie strony internetowe uległyby uszkodzeniu. Jest to jednak właściwość ograniczeń formatowania HTML (dla których istnieją inne strategie), a nie właściwość specyfikacji adresu URL. - person Kent Fredric; 23.01.2016
comment
ietf.org/rfc/rfc1738.txt – niebezpieczne znaki, w tym spacja) powinny być zakodowane - person Julien; 25.01.2016
comment
@KentFredric Jest to bardziej prawdopodobna warstwa prezentacyjna, a nie warstwa transportowa. Jak pisze Julien (prawie) oryginalna specyfikacja URI (RFC 1630) zawiera to ograniczenie, więc jest częścią samej specyfikacji URI, niezależnie od twoich osobistych odczuć. Ponieważ specyfikacja URI została napisana po wersjach roboczych protokołu HTTP, jest bardzo możliwe, że identyfikatory URI zostały zaprojektowane z myślą o HTTP, łącznie z zakazem używania spacji, ale to naprawdę nie ma znaczenia, prawda? Prawda jest taka, że ​​specyfikacja jest jaka jest specyfikacja. - person Christopher Schultz; 28.04.2018

Krótsza odpowiedź: nie, musisz zakodować spację; poprawne jest kodowanie spacji jako +, ale tylko w ciągu zapytania; w ścieżce musisz użyć %20.

person Peter Hilton    schedule 31.01.2009
comment
Cześć, też jestem zdezorientowany, czasami widziałem użycie książki +, ale czasami% 20, czy możesz pokazać jakiś przykład tego? Kiedy użytkownik przesyła formularz, w jaki sposób formularz koduje spację? z jaką postacią? - person Sam YC; 07.11.2012
comment
Zobacz tę odpowiedź, aby uzyskać dodatkowe szczegóły. - person DavidRR; 17.09.2014
comment
co z fragmentem/częścią mieszającą? Jak należy tam kodować spacje? - person humkins; 19.12.2014
comment
@gumkins: fragment (# i następne) nie jest wysyłany na serwer. W praktyce możesz użyć %20 lub + w dowolnym miejscu, aby zakodować spację. - person Julien; 12.09.2015

Adresy URL są zdefiniowane w RFC 3986, chociaż inne dokumenty RFC również są istotne, ale RFC 1738 jest przestarzały.

Mogą nie zawierać spacji, podobnie jak wiele innych znaków. Ponieważ te zabronione znaki często muszą być w jakiś sposób reprezentowane, istnieje schemat kodowania ich w adresie URL poprzez tłumaczenie ich na ich szesnastkowy odpowiednik ASCII z przedrostkiem „%”.

Większość języków/platform programowania zapewnia funkcje kodowania i dekodowania adresów URL, chociaż mogą one nie być odpowiednio zgodne ze standardami RFC. Na przykład wiem, że PHP tego nie robi.

person Rob Williams    schedule 31.01.2009

Tak, jednak spacja jest zwykle kodowana jako „%20”. Wszelkie parametry przekazywane do adresu URL powinny być zakodowane ze względów bezpieczeństwa.

person user54650    schedule 31.01.2009

Adres URL może zawierać znak spacji i w większości przeglądarek będzie wyświetlany jako %20, ale reguły kodowania przeglądarki zmieniają się dość często i nie możemy polegać na tym, jak przeglądarka wyświetli adres URL.

Zamiast tego możesz zastąpić znak spacji w adresie URL dowolnym znakiem, który Twoim zdaniem sprawi, że adres URL będzie bardziej czytelny i „ładny” ;) ..... O, więc ogólnie preferowane znaki to „-”, „_”, „+” ....ale to nie są przymusy, więc możesz użyć dowolnego znaku, który nie powinien już znajdować się w adresie URL.

Proszę unikać %,&,},{,],[,/,>,‹ jako zamiany znaków spacji w adresie URL, ponieważ mogą one spowodować błąd w niektórych przeglądarkach i platformach.

Jak widać, przepełnienie Staka używa znaku „-” jako zamiennika spacji (%20).

Miłego zadawania pytań.

person A.M Web Surfer    schedule 24.06.2012

Adresy URL nie powinny zawierać spacji. Jeśli chcesz zająć się takim, który to robi, użyj jego zakodowanej wartości %20

person Chris Ballance    schedule 31.01.2009

Czy ktoś może wskazać RFC wskazujący, że adres URL ze spacją musi być zakodowany?

URI, a tym samym adresy URL, są zdefiniowane w RFC 3986.

Jeśli spojrzysz na zdefiniowaną tam gramatykę, w końcu zauważysz, że znak spacji nigdy nie może być częścią składniowo legalnego adresu URL, dlatego termin „URL ze spacją” jest sam w sobie sprzecznością.

person Julian Reschke    schedule 31.01.2009

Odpowiedzieć na Twoje pytanie. Powiedziałbym, że aplikacje dość często zastępują spacje wartościami, które będą używane w adresach URL. Powodem tego jest zwykle uniknięcie trudniejszego do odczytania kodowania procentowego (URI).

Sprawdź ten artykuł w Wikipedii na temat kodowania procentowego.

person Eric Schoonover    schedule 31.01.2009

Firefox 3 będzie wyświetlać %20 w adresach URL jako spacje na pasku adresu.

person Sophie Alpert    schedule 31.01.2009
comment
To nie jest właściwa odpowiedź na całkiem proste pytanie: "Is a URL allowed to contain a space?". Raczej komentarz. - person Roko C. Buljan; 23.07.2019