Czy w adresie URL powinna być rozróżniana wielkość liter?


284

zauważyłem to

HTTP://STACKOVERFLOW.COM/QUESTIONS/ASK

i

http://stackoverflow.com/questions/ask

oba działają dobrze - w rzeczywistości poprzedni jest konwertowany na małe litery.

Myślę, że ma to sens dla użytkownika.

Jeśli spojrzę na Google, ten adres URL działa dobrze:

http://www.google.com/intl/en/about/corporate/index.html  

ale ten z „ABOUT” nie działa:

http://www.google.com/intl/en/ABOUT/corporate/index.html   

Czy w adresie URL powinna być rozróżniana wielkość liter?


13
IMHO, adres URL nigdy nie powinien rozróżniać wielkości liter, co tylko utrudnia życie osobom, które będą go używać.
Muhammad Umer

16
W pytaniu „W adresach URL POWINIEN być rozróżniana wielkość liter?” jest złym pytaniem, ponieważ wywołuje opinię. Lepszym pytaniem byłoby raczej „DLACZEGO (lub DLACZEGO nie są) adresy URL uwzględniają wielkość liter?” Lub „Dlaczego niektóre adresy URL rozróżniają wielkość liter, a inne nie?”
chharvey

Ale dla jednej z możliwych odpowiedzi, sprawdź WHATWG nowego URL standard , który został przyjęty przez node.js .
chharvey

moim zdaniem nie powinny być
Andrew

jeśli przeglądarka nie honoruje sprawy, adres ipfs zostanie uszkodzony, ale nie będzie uszkodzony
Beeno Tung

Odpowiedzi:


281

Zgodnie z „ HTML i adresy URL ” W3 powinny:

Mogą istnieć adresy URL lub części adresów URL, w których wielkość liter nie ma znaczenia, ale ich identyfikacja może nie być łatwa. Użytkownicy powinni zawsze brać pod uwagę, że w adresach URL rozróżniana jest wielkość liter.


95
Myślę, że „być liberalnym w tym, co akceptujesz, i konserwatywnym w tym, co wysyłasz” (mówienie IETF) byłoby moją wskazówką.
jldupont

9
Wytyczne W3 są rozsądne. Po prostu stwierdza, że ​​nie należy zakładać, w jaki sposób serwer obsługuje przesyłany adres URL. Od serwera zależy, jak obsłużyć adres URL żądania. Większość serwerów sieciowych to Unix / Linux, co oznacza, że ​​w większości serwerów internetowych rozróżniana jest wielkość liter.
o

37
W3 mówi, że UŻYTKOWNICY powinni założyć, że na serwerach rozróżniana jest wielkość liter, ale nie podaje rekomendacji dla SERWERÓW.
trysis

3
W celu zapewnienia odporności programy interpretujące adresy URL powinny traktować wielkie litery jako odpowiedniki małych liter w nazwach schematów (np. Zezwalaj na „HTTP” oraz „http”). Źródło
realPK

3
@PK_ Pamiętaj, że dotyczy to tylko części adresu URL schematu . RFC1738 nie dyskutuje, czy inne części adresu URL powinny być interpretowane jako uwzględniające wielkość liter, czy nie.
dthrasher

126

Wszystkie „ niewrażliwe ” są pogrubione dla czytelności.

Nazwy domen nie rozróżniają wielkości liter zgodnie z RFC 4343 . Reszta adresu URL jest wysyłana do serwera za pomocą metody GET. W tym może być rozróżniana wielkość liter lub nie.

Weźmy na przykład tę stronę, stackoverflow.com odbiera ciąg GET / pytania / 7996919 / rozróżnia wielkość liter , wysyłając dokument HTML do przeglądarki. Stackoverflow.com nie rozróżnia wielkości liter, ponieważ daje ten sam wynik dla / QUEStions / 7996919 / rozróżniana jest wielkość liter w adresie URL .

Z drugiej strony w Wikipedii rozróżniana jest wielkość liter, z wyjątkiem pierwszego znaku tytułu. Adresy URL https://en.wikipedia.org/wiki/Case_sensitivity i https://en.wikipedia.org/wiki/case_sensitivity prowadzą do tego samego artykułu, ale https://en.wikipedia.org/wiki/CASE_SENSITIVITY zwraca 404


7
Wikipedia w rzeczywistości bardzo wybacza rozróżnianie wielkości liter w przypadkach, w których użytkownicy mogą myśleć, że słowo powinno być taką czy inną literą, ale jest to bardziej z powodu OCD ... przepraszam, rozważny charakter jego redaktorów. Jednak w adresach URL rozróżniana jest wielkość liter.
trysis

14
Jest tak, ponieważ semantyczna, czytelna część adresu URL pytania w przepełnieniu stosu nie identyfikuje go, jest identyfikowana przez 7996919. Semantyczna część adresu URL jest tylko do celów SEO.
user3367701,

4
Właściwie działa również /programming/7996919/should-BLABLA-be-or-NOT-to-be . Wynika to z faktu, że serwer stackoverflow.com używa tylko identyfikatora pytania do jego identyfikacji i zwrócenia poprawnego adresu URL i strony HTML.
Bozzy

72

Zależy od hosta os. Witryny hostowane w systemie Windows zwykle nie rozróżniają wielkości liter, ponieważ w bazowym systemie plików nie jest rozróżniana wielkość liter. W witrynach hostowanych w systemach typu Unix rozróżniana jest wielkość liter, ponieważ w bazowych systemach plików zwykle rozróżniana jest wielkość liter. W części adresu URL w nazwie hosta zawsze rozróżniana jest wielkość liter, reszta ścieżki jest różna.


1
Tak, ponieważ ten boleśnie dowiedział się o żądaniach HTTP do plików na uniksowym serwerze ftp.
Laurie Stearn

1
Bardziej trafne byłoby powiedzenie „zależy od serwera” w ogólnym znaczeniu - ponieważ udostępnianie plików nie jest jedynym sposobem odpowiadania na żądania HTTP.
Valentin Waeselynck

31

Nazwa domeny część adresu URL nie jest wielkość liter, ponieważ DNS ignoruje sprawy: http://en.example.org/a HTTP://EN.EXAMPLE.ORG/zarówno otwarta ta sama strona.

Ścieżka służy do określenia i znalezienia żądanego zasobu. Rozróżniana jest wielkość liter, chociaż niektóre serwery, zwłaszcza te oparte na systemie Microsoft Windows, mogą traktować wielkość liter jako bez rozróżniania wielkości liter.

Jeśli na serwerze rozróżniana jest wielkość liter i http://en.example.org/wiki/URLjest ona poprawna, wtedy http://en.example.org/WIKI/URLlub http://en.example.org/wiki/urlwyświetli stronę błędu HTTP 404, chyba że te adresy URL wskazują same ważne zasoby.


3
Ta odpowiedź ma jedyne poprawne sformułowanie „rozróżnia wielkie i małe litery, chociaż można ją traktować jako bez rozróżniania wielkości liter”. Tylko ważna odpowiedź.
Daniel W.

@ DanFromGermany, w ścieżce rozróżniana jest wielkość liter. Można stąd wydedukować niejasno. „W adresach URL ogólnie rozróżniana jest wielkość liter (z wyjątkiem nazw komputerów). Mogą istnieć adresy URL lub części adresów URL, w których wielkość liter nie ma znaczenia, ale identyfikacja mogą nie być łatwe ”. Ale dwuznaczne jest wydedukowanie tego. Jak wspomniano w jednym z powyższych komentarzy, RFC1738 nie dyskutuje, czy części adresu URL inne niż schemat należy interpretować jako rozróżniające małe i wielkie litery. Czy masz link, który wyjaśnia, które części adresu URL uwzględniają wielkość liter?
granat

2
@garnet Z RFC3986 6.2.2.1. Normalizacja wielkości HTTP://www.EXAMPLE.com/http://www.example.com/
Daniel W.,

2
@garnet I z HTTP RFC : „ Porównując dwa identyfikatory URI, aby zdecydować, czy pasują, czy nie, klient POWINIEN używać porównania wielkości URI z uwzględnieniem liczby oktetów dla wszystkich URI [...] ” (z wyjątkiem schematu i sam host).
Daniel W.,

15

Nie jestem fanem podrzucania starych artykułów, ale ponieważ była to jedna z pierwszych odpowiedzi na ten konkretny problem, poczułem potrzebę wyjaśnienia czegoś.

Jak odpowiedź @Bhavin Shah stwierdza, że ​​w części adresu URL domeny nie jest rozróżniana wielkość liter, więc

http://google.com 

i

http://GOOGLE.COM 

i

http://GoOgLe.CoM 

są takie same, ale wszystko po części nazwy domeny jest uważane za rozróżnianą wielkość liter.

więc...

http://GOOGLE.COM/ABOUT

i

http://GOOGLE.COM/about

są różne.

Uwaga: W wielu przypadkach mówię „technicznie”, a nie „dosłownie”, w większości przypadków serwery są skonfigurowane do obsługi tych samych elementów, ale można je skonfigurować tak, aby NIE były obsługiwane tak samo.

Różne serwery traktują to inaczej i w niektórych przypadkach muszą uwzględniać wielkość liter. W wielu przypadkach wartości ciągu zapytania są zakodowane (takie jak Session ID lub dane zakodowane w Base64, które są przekazywane jako wartość ciągu zapytania). W tych elementach rozróżniana jest wielkość liter, więc serwer musi rozróżniać małe i wielkie litery przy ich przetwarzaniu.

Aby odpowiedzieć na pytanie, czy serwery powinny rozróżniać małe i duże litery podczas pobierania tych danych, odpowiedź brzmi „tak, zdecydowanie”.

Oczywiście nie wszystko musi uwzględniać wielkość liter, ale serwer powinien wiedzieć, co to jest i jak sobie z nimi poradzić.


Komentarz Hart Simha w zasadzie mówi to samo. Przegapiłem go przed opublikowaniem, więc chcę przyznać kredyt tam, gdzie jest on należny.



3

Rozważ następujące:

https://www.example.com/createuser.php?name=Paul%20McCartney

W tym hipotetycznym przykładzie formularz HTML - przy użyciu metody GET - wysyła parametr „name” do skryptu PHP, który tworzy nowe konto użytkownika.

W tym przykładzie powołuję się na to, że w tym parametrze GET należy rozróżniać małe i wielkie litery, aby zachować wielkie litery „McCartney” (lub, jako inny przykład, zachować „Walter d'Isney”, ponieważ istnieją inne sposoby dla nazw, które łamią zwykłe reguły wielkich liter).

To takie przypadki, które kierują zaleceniem W3C, że system i host nie rozróżniają wielkości liter, ale wszystko po tym może rozróżniać małe i wielkie litery - i jest to pozostawione serwerowi. Wymuszenie niewrażliwości na wielkość liter w standardzie spowodowałoby, że powyższy przykład nie byłby w stanie zachować przypadku wprowadzania danych przez użytkownika przekazanego jako parametr zapytania GET.

Ale powiedziałbym, że chociaż z konieczności jest to litera prawa uwzględniająca takie przypadki, duchem prawa jest to, że tam, gdzie sprawa jest nieistotna, zachowuj się w sposób niewrażliwy na sprawy. Standardy nie mogą jednak powiedzieć, gdzie wielkość liter jest nieistotna, ponieważ podobnie jak podane przeze mnie przykłady, jest to zależne od kontekstu.

(np. nazwa użytkownika konta najprawdopodobniej najlepiej zmusza do rozróżniania wielkości liter - ponieważ „User123” i „user123” będące różnymi kontami mogą się mylić - nawet jeśli w ich prawdziwej nazwie, jak wyżej, najlepiej rozróżniana jest wielkość liter).

Czasami jest to istotne, w większości przypadków nie. Ale decyzję o tych rzeczach należy pozostawić twórcy serwerów / stron WWW - i nie może być to przepisane normalnie - ponieważ tylko na tym poziomie można by poznać kontekst.

Schemat i host nie rozróżniają wielkości liter (co pokazuje preferencję standardu dla rozróżniania wielkości liter, gdzie można to powszechnie przepisać). Reszta należy do Ciebie, ponieważ lepiej rozumiesz kontekst. Ale, jak już wspomniano, w duchu prawa prawdopodobnie powinieneś domyślnie nie zwracać uwagi na wielkość liter, chyba że masz ku temu dobry powód.


Czy ciągi zapytań są traktowane jako część lokalizacji? Uważam, że są one traktowane jako osobne jednostki i nie są wykorzystywane do rozstrzygania lokalizacji.
jpmc26

Ciągi zapytań są oddzielone od lokalizacji, tak. Ale te same zasady, które pokazałem tam z parametrami zapytania, mogą mieć zastosowanie również do innych części adresu URL. Na przykład niektóre CMSy mogą celowo przepisać „/user.php?id=3756” na „/ users / PaulMcCartney”, aby uzyskać bardziej przyjazne dla SEO adresy URL czytelne dla ludzi (na przykład Wordpress). Chodzi o to, że standardy celowo wycofują się z recepty nad tym, co zależy od kontekstu. Serwer musi zdecydować, ponieważ serwer rozumie kontekst, w którym uniwersalny standard nie może.
Bob

2

Adresy URL nie rozróżniają wielkości liter, chyba że istnieje dobry powód, dla którego nie powinny.

Nie jest to obowiązkowe (nie jest to żadna część RFC), ale sprawia, że ​​komunikacja i przechowywanie adresów URL są znacznie bardziej niezawodne.

Jeśli mam dwie strony w witrynie:

http://stackoverflow.com/ABOUT.html

i

http://stackoverflow.com/about.html

Czym powinny się różnić? Być może napisano „styl krzyczenia” (wielkie litery) - ale z punktu widzenia IA rozróżnienia w przypadku adresu URL nigdy nie należy wprowadzać.

Co więcej, łatwo jest to zaimplementować w Apache - wystarczy użyć CheckSpelling Onz mod_Speling.


0

Stare pytanie, ale natknąłem się tutaj, więc dlaczego nie spróbować, ponieważ pytanie szuka innej perspektywy, a nie ostatecznej odpowiedzi.

w3c może mieć swoje rekomendacje - co mnie bardzo obchodzi - ale chcę przemyśleć, skoro pytanie jest tutaj.

Dlaczego w3c uważa, że ​​w nazwach domen nie jest rozróżniana wielkość liter, a następnie pozostawia coś bez rozróżniania wielkości liter?

Myślę, że uzasadnieniem jest to, że część domeny adresu URL jest wpisywana ręcznie przez użytkownika. Wszystko po byciu hipertekstem zostanie rozwiązane przez maszynę (przeglądarka i serwer z tyłu).

Maszyny lepiej radzą sobie z rozróżnianiem wielkości liter niż ludzie (nie jest to techniczne :)).

Ale pytanie jest tylko dlatego, że maszyny MOGĄ obsłużyć, że należy to zrobić w ten sposób?

Mam na myśli jakie są korzyści z nazywania i uzyskiwania dostępu do zasobu siedzącego w hereIsTheResourcevs hereistheresource?

Boczna jest bardzo nieczytelna niż obudowa wielbłąda, która jest bardziej czytelna. Czytelne dla ludzi (w tym techniczne).

Oto moje punkty: -

Ścieżka zasobów znajduje się gdzieś pośrodku struktury programowania i czasami jest blisko użytkownika końcowego za przeglądarką.

Twój adres URL (bez nazwy domeny) nie powinien rozróżniać wielkości liter, jeśli użytkownicy powinni go dotykać lub wpisywać itp. Powinieneś opracować swoją aplikację w celu UNIKNIĘCIA, tak aby użytkownicy wpisywali ścieżkę tak często, jak to możliwe.

W adresie URL (bez nazwy domeny) rozróżniana jest wielkość liter, jeśli użytkownicy nigdy nie wpisaliby go ręcznie.

Wniosek

Ścieżka powinna uwzględniać wielkość liter. Moje punkty ważą ścieżki wrażliwe na wielkość liter.


0

Znaki URL są konwertowane na kod szesnastkowy (jeśli kiedykolwiek zauważyłeś spacje w adresach URL wyświetlane jako% 20 itp.), A ponieważ małe i duże litery mają różne wartości szesnastkowe, to jest całkowicie zrozumiałe, że w adresach URL z całą pewnością rozróżniana jest wielkość liter. Jednak wydaje się, że duch tego pytania POWINNY być standardem i mówię „nie”, ale są. To deweloper / dostawca musi uwzględnić to w swoim kodzie, jeśli chcą, aby działał niezależnie od użytkownika końcowego.


to jest interesujące. zwykłe znaki e ASCII (które mają duże i małe litery) nie są tak naprawdę konwertowane, prawda? to tylko spacje i rozszerzone znaki są uciekane w adresie URL. Czy jakieś rozszerzone znaki mają modyfikatory wielkich / małych liter?
TygerKrash

0

Myślę, że w tej i wielu odpowiedziach dotyczących tego, co mówi lub nie mówi specyfikacja, brakuje sedna pytania. Czy powinny uwzględniać wielkość liter? To naprawdę zadane pytanie. Z punktu widzenia użytkownika rozróżnianie wielkości liter jest problemem, nie wszyscy wiedzą, że to robi różnicę. Pytanie, czy identyfikatory URI powinny być, czy nie, zależy od kontekstu pytania. Tak, powinny być, jeśli chodzi o elastyczność techniczną. Jeśli chodzi o użyteczność, nie, nie powinny.


Szczerze mówiąc, każde pytanie „POWINNY” jest z natury oparte na opiniach i może zostać usunięte z StackOverflow. (Więcej: stackoverflow.blog/2010/09/29/good-subjective-bad-subjective )
chharvey

0

Zabezpieczanie skrzynek

Adresy URL zachowują wielkość liter między klientem a serwerem. Jednak w niektórych adresach URL rozróżniana jest wielkość liter , w zależności od serwera, z kilku powodów.

Rozróżnianie wielkości liter

W poniższych pogrubionych częściach adresów URL może być rozróżniana wielkość liter, zależnie od konfiguracji witryny i / lub serwera.

    http: // www. example.com /abc/def.ghi?jkl=mno#pqr

    użytkownik @ example.com

Racjonalne uzasadnienie

Rozróżnianie wielkości liter w adresach URL może mieć kilka zastosowań. Głównie:

  1. Natywna kompatybilność z systemami plików z rozróżnianiem wielkości liter.
  2. Bardziej kompaktowe kodowanie danych w adresach URL, takie jak serializacja, haszowanie, identyfikatory, łącza bezpośrednie i skracacze adresów URL.

Jako programista uważam, że powyższe często można rozwiązać lepiej, ale rozumiem też, że istnieją przypadki, w których sytuacja może na to nie pozwolić.

Na przykład wyobraź sobie istniejący produkt, który wymaga dużej ilości danych umieszczonych w adresie URL „GET”, ale musi być zgodny z maksymalnymi długościami adresów URL wszystkich głównych serwerów, przeglądarek i mechanizmów buforowania / proxy. Aby zmieścić nawet ciąg poleceń o średniej długości (poniżej 1024 znaków w niektórych starszych przeglądarkach), musisz użyć każdego unikalnego znaku bezpiecznego adresu URL, który możesz (co w zasadzie jest kodowaniem base64url).

W idealnym świecie

To, czy adresy URL powinny być rozróżniana jest dyskusyjna. Osobiście uważam, że tak nie powinno być, dla uproszczenia (chociaż może tworzyć dłuższe adresy URL, mamy procenty ucieczki, aby łatwo obsłużyć przypadki, w których musimy zapewnić zachowanie dokładnych znaków, i istnieją sposoby przesyłania danych inne niż bezpośrednio w adresie URL) .

Wiele osób zgadza się z tym, że adresy URL bez rozróżniania wielkości liter są jawnie włączone dla wielu popularnych witryn i usług, w celu zwiększenia użyteczności. Najbardziej widocznym przykładem jest część adresów e-mail dotycząca nazwy użytkownika. Większość dostawców poczty e-mail zignoruje wielkość liter, a czasem nawet kropki i inne symbole (np. „J.smith@example.com” jest taki sam jak „JSMITH@example.com”). Mimo że w nazwach użytkowników wiadomości e-mail rozróżniana jest wielkość liter, zgodnie ze specyfikacją.

Jednak faktem jest, że pomimo tego, czego ja lub inni moglibyśmy chcieć, taki jest stan rzeczy, które obecnie działają. I chociaż na całym świecie możliwe jest z pewnością przejście na standard URL-a bez rozróżniania wielkości liter, prawdopodobnie zajmie to sporo czasu, ponieważ rozróżnianie wielkości liter jest obecnie szeroko stosowane w Internecie do różnych celów.

Najlepsze praktyki

Jeśli chodzi o najlepsze praktyki, jako użytkownik możesz rozsądnie trzymać się małych liter w większości sytuacji i oczekiwać, że wszystko zadziała. Głównymi wyjątkami byłyby adresy URL wykorzystujące kodowanie oparte na wielkości liter lub ścieżki dokumentów z bezpośrednimi odpowiednikami systemu plików. Jednak takie złożone adresy URL są zazwyczaj wklejane (lub po prostu klikane), a nie ręcznie.

Jako twórca stron internetowych, powinieneś rozważyć zachowanie URL-i bez rozróżniania wielkości liter. Chociaż wyraźnie istnieją pewne trudne do uniknięcia sytuacje, w zależności od kontekstu, jak wspomniano powyżej.


-1

pytanie brzmi: czy w adresie URL powinna być uwzględniana wielkość liter?

Nie widzę sensu ani dobrej praktyki za rozróżnianiem wielkości liter. To głupie, do bani i należy go zawsze unikać.

Dla przypomnienia mojej opinii, kiedy ktoś pyta, jaki adres URL, jak możesz wyjaśnić, jakie znaki adresu URL mają wielkie lub małe litery? To nonsens i nikt nigdy nie powinien ci mówić inaczej.


32
Zaletą adresów URL jest rozróżnianie wielkości liter. W niektórych witrynach internetowych, w których obiekty są kodowane za pomocą unikalnych identyfikatorów, do których można odwoływać się za pośrednictwem adresu URL, kodowanie może być podobne do base64 zamiast base36 . Pozwala to zakodować wykładniczo więcej unikalnych obiektów w tej samej liczbie znaków URL. Na przykład foo.com/000 - foo.com/zzz (bez rozróżniania wielkości liter) może odnosić się do 36 ^ 3 unikalnych obiektów, gdzie jako foo.com/000 - foo.com/ZZZ (rozróżniana jest wielkość liter, co oznacza foo.com/zzz i foo.com/ZZZ to różne ścieżki), odnosiłby się do 62 ^ 3 obiektów.
Hart Simha,

6
To nie jest odpowiedź, to komentarz.
Tin Man,

1
Popieram to przykładem. Adresy URL są używane przez ludzi - patrz oryginalne pytanie - a nie komputery. Jest to bardzo trudne, więc zobacz DLACZEGO link nie działa, a ponieważ prawie WSZYSTKIE domeny nie rozróżniają wielkości liter, podobnie jak reszta adresu URL. Opinie są za moim tonem głosu (co jest złe) lub dlatego, że ludzie techniczni wybierają piękno techniczne zamiast wrażeń użytkownika.
HenriKoppen,

1
@ theTinMan Jest to odpowiedź na pytanie budzące opinię.
chharvey

Zgadzam się z @HartSimha i ponieważ pytanie wymaga opinii: O ile część trasy URL nie jest użyta do zidentyfikowania unikalnego obiektu, proszę, z miłości do wszystkiego, co dobre w Internecie, NIE rozróżniaj wielkości liter.
jaybro

-3

W przypadku witryn hostowanych na serwerze Linux rozróżniana jest wielkość liter. http://www.google.com/about i http://www.google.com/About zostaną przekierowane do różnych lokalizacji. W systemie Windows Server URL nie rozróżnia wielkości liter, tak jak w przypadku nazywania FOLDERU i zostanie przekierowany do tej samej lokalizacji.


-6

Możliwe jest tworzenie nie uwzględniających wielkości liter adresów URL

RewriteEngine on
rewritemap lowercase int:tolower
RewriteCond $1 [A-Z]
RewriteRule ^/(.*)$ /${lowercase:$1} [R=301,L]

Tworzenie Google.com..GOOGLE.com itp. Bezpośrednio na google.com


To nie odpowiada na pytanie
monokrome

3
Pytanie brzmi: „Czy w adresie URL rozróżniana jest wielkość liter?” Twoja odpowiedź brzmi: „Jak sprawić, by adresy URL bez rozróżniania wielkości liter”
realPK
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.