Dlaczego w adresach URL rozróżniana jest wielkość liter?

54

Moje pytanie: kiedy adresy URL zostały po raz pierwszy zaprojektowane, dlaczego rozróżniana jest wielkość liter? Pytam o to, ponieważ wydaje mi się (np. Laikowi), że rozróżnianie wielkości liter byłoby preferowane, aby zapobiec niepotrzebnym błędom i uprościć i tak już skomplikowany ciąg tekstu.

Ponadto, czy istnieje rzeczywisty cel / korzyść posiadania adresu URL z rozróżnianiem wielkości liter (w przeciwieństwie do zdecydowanej większości adresów URL, które prowadzą do tej samej strony bez względu na wielkie litery)?

Wikipedia, na przykład, jest witryną wrażliwą na wielkość liter (z wyjątkiem pierwszego znaku):

https://en.wikipedia.org/wiki/St ck_Exchange jest DOA.

Kyle
źródło
11
Oczywiście nie uruchamiasz IIS w systemie Windows
John Conde
53
Wyobrażam sobie, że itscrap.com, expertsexchange i whorepresents.com wolą, aby więcej osób używało nazw z rozróżnianiem wielkości liter. Więcej informacji można znaleźć na stronie boredpanda.com/worst-domain-names .
Eric Towers
22
Adresy URL zostały zaprojektowane, gdy dinozaury renderowane w systemach uniksowych wędrowały po Ziemi, a Unix rozróżnia małe i wielkie litery.
Thorbjørn Ravn Andersen
11
Wikipedia stara się używać poprawnej wielkości liter w tytule tematu i używa przekierowań dla typowych różnic. na przykład. html, htmA Htmlwszystkie przekierowania HTML. Ale co ważne, ze względu na olbrzymi przedmiot może istnieć więcej niż jedna strona, na której adres URL różni się tylko wielkością liter. Na przykład: Latex i LaTeX
MrWhite
7
@ edc65 Ale Kobi twierdzi, że w części adresu URL (w szczególności ścieżki ) rozróżniana jest wielkość liter - więc czy to nie sprawia, że ​​w adresie URL (jako całości) rozróżniana jest wielkość liter?
MrWhite

Odpowiedzi:

8

Dlaczego w adresie URL nie jest rozróżniana wielkość liter?

Rozumiem, że może to wyglądać jak prowokujący (i „diabelski adwokat”) retoryczne pytanie, ale myślę, że warto to rozważyć. Projekt HTTP polega na tym, że „klient”, który zwykle nazywamy „przeglądarką internetową”, prosi „serwer sieciowy” o dane.

Wydano wiele, wiele różnych serwerów WWW. Microsoft wydał IIS z systemami operacyjnymi Windows Server (i innymi, w tym Windows XP Professional). Unix ma duże wagi, takie jak nginx i Apache, nie wspominając o mniejszych ofertach, takich jak wewnętrzny httpd OpenBSD, thttpd lub lighttpd. Ponadto wiele urządzeń z obsługą sieci ma wbudowane serwery sieciowe, których można używać do konfigurowania urządzenia, w tym urządzenia przeznaczone do określonych celów w sieci, takie jak routery (w tym wiele punktów dostępu Wi-Fi i modemów DSL) oraz inne urządzenia, takie jak drukarki lub UPS (zasilacze bezprzerwowe zasilane bateryjnie), które mogą mieć połączenie sieciowe.

Pytanie „Dlaczego w adresach URL rozróżniana jest wielkość liter?” Brzmi zatem: „Dlaczego serwery WWW traktują adres URL jako rozróżniający małe i wielkie litery?” Właściwa odpowiedź brzmi: nie wszyscy tak robią. Co najmniej jeden serwer WWW, który jest dość popularny, zwykle NIE rozróżnia wielkości liter. (Serwer WWW to IIS.)

Kluczowy powód różnych zachowań między różnymi serwerami internetowymi sprowadza się prawdopodobnie do prostoty. Prostym sposobem na stworzenie serwera WWW jest zrobienie tego samego, co w przypadku sposobu, w jaki system operacyjny komputera / urządzenia lokalizuje pliki. Wiele razy serwery sieciowe lokalizują plik w celu udzielenia odpowiedzi. Unix został zaprojektowany na komputerach wyższej klasy, więc Unix zapewniał pożądaną funkcjonalność pozwalającą na pisanie wielkimi i małymi literami. Unix postanowił traktować wielkie i małe litery jako różne, ponieważ, cóż, są różne. To jest prosta, naturalna rzecz do zrobienia. Historia Windows nie uwzględnia wielkości liter ze względu na chęć obsługi już utworzonego oprogramowania, a historia ta sięga wstecz do DOS, który po prostu nie obsługiwał małych liter, być może w celu uproszczenia rzeczy z mniej wydajnymi komputerami, które zużywały mniej pamięci. Ponieważ te systemy operacyjne są różne, w rezultacie proste (wczesne wersje) serwerów WWW odzwierciedlają te same różnice.

Teraz, z całym tym tłem, oto kilka konkretnych odpowiedzi na konkretne pytania:

Kiedy adresy URL zostały po raz pierwszy zaprojektowane, dlaczego rozróżniana jest wielkość liter?

Dlaczego nie? Jeśli wszystkie standardowe serwery internetowe nie rozróżniają wielkości liter, oznaczałoby to, że serwery WWW przestrzegały zestawu reguł określonych przez standard. Po prostu nie było reguły, która mówi, że przypadek należy zignorować. Powodem braku reguły jest po prostu brak takiej reguły. Po co zawracać sobie głowę niepotrzebnymi zasadami?

Pytam o to, ponieważ wydaje mi się (np. Laikowi), że rozróżnianie wielkości liter byłoby preferowane, aby zapobiec niepotrzebnym błędom i uprościć i tak już skomplikowany ciąg tekstu.

Adresy URL zostały zaprojektowane dla maszyn do przetwarzania. Chociaż dana osoba może wpisać pełny adres URL w pasku adresu, nie była to znacząca część zamierzonego projektu. Zamierzony projekt polega na tym, że ludzie będą podążać za (hiperłączami). Jeśli robią to przeciętny laicy, to naprawdę nie obchodzi ich, czy niewidoczny adres URL jest prosty czy skomplikowany.

Ponadto, czy istnieje rzeczywisty cel / korzyść posiadania adresu URL z rozróżnianiem wielkości liter (w przeciwieństwie do zdecydowanej większości adresów URL, które prowadzą do tej samej strony bez względu na wielkie litery)?

Piąty numer odpowiedzi Williama Hay'a wymienia jedną zaletę techniczną: adresy URL mogą być skutecznym sposobem, aby przeglądarka internetowa wysłała trochę informacji do serwera internetowego, a więcej informacji można dołączyć, jeśli istnieją mniejsze ograniczenia, więc rozróżniaj wielkość liter ograniczenie ograniczyłoby ilość informacji, które można zawrzeć.

Jednak w wielu przypadkach wrażliwość na wielkość liter nie jest szczególnie atrakcyjna, o czym świadczy fakt, że usługi IIS zwykle nie przejmują się tym.

Podsumowując, najbardziej przekonującym powodem jest prawdopodobnie po prostu prostota dla tych, którzy zaprojektowali oprogramowanie serwera WWW, szczególnie na platformie rozróżniającej wielkość liter, takiej jak Unix. (HTTP nie był czymś, co wpłynęło na oryginalny design Uniksa, ponieważ Unix jest znacznie starszy niż HTTP).

TOOGAM
źródło
„Kluczowy powód odmiennego działania różnych przeglądarek internetowych sprowadza się prawdopodobnie do prostoty”. - Zakładam, że masz na myśli „serwery internetowe”, a nie „przeglądarki internetowe” tutaj i w kilku innych miejscach?
MrWhite
2
Zaktualizowano Przejrzałem każdy przypadek „przeglądarek” i dokonałem wielu wymian. Dziękujemy za zwrócenie na to uwagi, aby można było poprawić jakość.
TOOGAM
1
Otrzymałem kilka doskonałych odpowiedzi na moje pytanie, od historycznych po techniczne. Waham się, czy pójść na całość i zaakceptować niższą ocenę, ale odpowiedź @ TOOGAM była dla mnie najbardziej pomocna. Ta odpowiedź jest wyczerpująca i wyczerpująca, ale wyjaśnia tę koncepcję w nieskomplikowany, konwersacyjny sposób, który mogę zrozumieć. Myślę, że ta odpowiedź jest dobrym wstępem do bardziej szczegółowych wyjaśnień.
Kyle
74

W adresach URL nie jest rozróżniana wielkość liter, tylko ich części.
Na przykład w adresie URL nie jest rozróżniana wielkość liter https://google.com,

W odniesieniu do RFC 3986 - Uniform Resource Identifier (URI): Ogólna składnia

Po pierwsze, z Wikipedii , URL wygląda następująco:

 scheme:[//host[:port]][/]path[?query][#fragment]

(Usunąłem user:passwordczęść, ponieważ nie jest interesująca i rzadko używana)

programy nie uwzględniają wielkości liter

Podskładnik hosta nie rozróżnia wielkości liter.

Składnik ścieżki zawiera dane ...

Komponent zapytania zawiera dane niehierarchiczne ...

Poszczególne typy mediów mogą definiować własne ograniczenia lub struktury w składni identyfikatora fragmentu w celu określenia różnych typów podzbiorów, widoków lub odnośników zewnętrznych

Tak, schemei hostsą wielkości liter.
W pozostałej części adresu URL rozróżniana jest wielkość liter.

Dlaczego wielkość pathliter ma znaczenie?

To wydaje się być głównym pytaniem.
Trudno jest odpowiedzieć „dlaczego” coś zostało zrobione, jeśli nie zostało to udokumentowane, ale możemy zgadywać.
Wybrałem bardzo szczegółowe cytaty ze specyfikacji, z naciskiem na dane .
Spójrzmy jeszcze raz na adres URL:

 scheme:[//host[:port]][/]path[?query][#fragment]
 \____________________/\________________________/
        Location                 Data
  • Lokalizacja - lokalizacja ma postać kanoniczną i nie uwzględnia wielkości liter. Dlaczego? Prawdopodobnie po to, byś mógł kupić nazwę domeny bez konieczności kupowania tysięcy wariantów.

  • Dane - dane są używane przez serwer docelowy, a aplikacja może wybrać, co to znaczy . Nie ma sensu, aby dane rozróżniały wielkość liter. Aplikacja powinna mieć więcej opcji, a zdefiniowanie rozróżniania wielkości liter w specyfikacji ograniczy te opcje.
    Jest to również przydatne rozróżnienie dla HTTPS: dane są szyfrowane , ale host jest widoczny.

To jest użyteczne?

Rozróżnianie wielkości liter ma swoje pułapki, jeśli chodzi o buforowanie i kanoniczne adresy URL, ale z pewnością jest użyteczne. Kilka przykładów:

Kobi
źródło
1
„W adresach URL nie rozróżniana jest wielkość liter.” / „W pozostałej części adresu URL rozróżniana jest wielkość liter.” - Wydawałoby się to sprzecznością?
MrWhite
8
W rzeczywistości schemat określa, czego można się spodziewać w pozostałej części adresu URL. http:a powiązane schematy oznaczają, że adres URL odnosi się do nazwy hosta DNS. DNS na długo przed wynalezieniem adresów URL nie rozróżniał wielkości liter w kodzie ASCII. Zobacz str. 55 ietf.org/rfc/rfc883.txt
O. Jones
3
Ładnie szczegółowe! Szedłem z historycznego punktu widzenia. Oryginalnie ścieżka do pliku wymagała rozróżniania wielkości liter tylko w przypadku uderzenia w system plików. W przeciwnym razie tak nie było. Ale dzisiaj wszystko się zmieniło. Na przykład parametry i CGI nie istniały pierwotnie. Twoja odpowiedź ma aktualną perspektywę dnia. Musiałem nagrodzić twoje wysiłki !! Naprawdę kopałeś w tym! Kto wiedział, że to wysadzi w powietrze? Twoje zdrowie!!
closetnoc
2
@ w3dk: to niezbyt interesujące dziwactwo terminologiczne, ale możesz wziąć pod uwagę „rozróżnianie wielkości liter”, „zmiana wielkości znaków może zmienić całość”, lub możesz to powiedzieć „zmiana przypadek postaci zawsze zmienia całość ". Wydaje się, że Kobi twierdzi to drugie, woli, aby rozróżnianie wielkości liter oznaczało „każda zmiana wielkości liter jest znacząca”, co oczywiście nie jest prawdą w przypadku adresów URL. Wolisz te pierwsze. To tylko kwestia wrażliwości na wielkość liter.
Steve Jessop
2
@ rybo111: Jeśli użytkownik wpisze example.com/fOObaR , specyfikacja wymaga, aby serwer na www.example.com otrzymał ścieżkę „/ fOObaR”, jak podano; milczy na pytanie, czy serwer musi traktować to inaczej niż „/ foOBaR”.
supercat
59

Prosty. System operacyjny rozróżnia małe i wielkie litery. Serwery WWW na ogół nie dbają o to, chyba że w pewnym momencie będą musiały uderzyć w system plików. To tutaj Linux i inne systemy operacyjne oparte na Uniksie egzekwują reguły systemu plików, w których rozróżnianie wielkości liter ma duże znaczenie. Dlatego w IIS nigdy nie rozróżniano wielkości liter; ponieważ Windows nigdy nie rozróżniał wielkości liter.

[Aktualizacja]

W komentarzach (od momentu usunięcia) pojawiły się mocne argumenty na temat tego, czy adresy URL mają związek z systemem plików, jak już powiedziałem. Te argumenty stały się gorące. Wierzenie, że nie ma związku, jest niezwykle krótkowzroczne. Tam jest absolutnie! Pozwól mi wyjaśnić dalej.

Programiści aplikacji zazwyczaj nie są programistami wewnętrznymi systemów. Nie obrażam się. Są to dwie odrębne dyscypliny, a wiedza wewnętrzna nie jest wymagana do pisania aplikacji, gdy aplikacje mogą po prostu nawiązywać połączenia z systemem operacyjnym. Ponieważ programiści aplikacji nie są programistami wewnętrznymi systemów, omijanie usług systemu operacyjnego nie jest możliwe. Mówię to, ponieważ są to dwa osobne obozy i rzadko się krzyżują. Aplikacje są napisane, aby z reguły korzystać z usług systemu operacyjnego. Oczywiście są rzadkie wyjątki.

Kiedy zaczęły pojawiać się serwery WWW, twórcy aplikacji nie próbowali ominąć usług systemu operacyjnego. Było tego kilka przyczyn. Po pierwsze, nie było to konieczne. Po drugie, programiści aplikacji ogólnie nie wiedzieli, jak ominąć usługi systemu operacyjnego. Po trzecie, większość systemów operacyjnych była albo wyjątkowo stabilna i solidna, albo wyjątkowo prosta i lekka i nie warta kosztów.

Należy pamiętać, że wczesne serwery WWW działały na drogich komputerach, takich jak serwery DEC VAX / VMS i Unix dnia (Berkeley i Ultrix, a także inne) na komputerach z ramką główną lub środkową, a wkrótce potem lekkie komputery, takie jak PC i Windows 3.1. Kiedy zaczęły pojawiać się bardziej nowoczesne wyszukiwarki, takie jak Google w latach 1997/8, Windows przeniósł się do Windows NT, a inne systemy operacyjne, takie jak Novell i Linux, również zaczęły obsługiwać serwery sieciowe. Apache był dominującym serwerem sieciowym, choć były też inne, takie jak IIS i O'Reilly, które również były bardzo popularne. Żadna z nich nie omijała usług systemu operacyjnego. Prawdopodobnie żaden z serwerów WWW nie robi tego nawet dzisiaj.

Wczesne serwery WWW były dość proste. Nadal są dzisiaj. Każde żądanie dotyczące zasobu za pośrednictwem żądania HTTP, które istnieje na dysku twardym, zostało złożone przez serwer WWW za pośrednictwem systemu plików OS.

Systemy plików to raczej proste mechanizmy. Po złożeniu wniosku o dostęp do pliku, jeśli plik ten istnieje, jest on przekazywany do podsystemu autoryzacji, a jeśli zostanie spełniony, pierwotne żądanie jest spełnione. Jeśli zasób nie istnieje lub nie jest autoryzowany, system zgłasza wyjątek. Gdy aplikacja wysyła żądanie, wyzwalacz jest ustawiany i aplikacja czeka. Po odebraniu żądania wyzwalacz jest generowany, a aplikacja przetwarza odpowiedź na żądanie. Nadal działa to w ten sposób dzisiaj. Jeśli aplikacja stwierdzi, że żądanie zostało spełnione, jest kontynuowane, jeśli się nie powiedzie, aplikacja wykonuje warunek błędu w swoim kodzie lub umiera, jeśli nie zostanie obsłużona. Prosty.

W przypadku serwera WWW, zakładając, że zostało wysłane żądanie adresu URL ścieżki / pliku, serwer internetowy pobiera część ścieżki / pliku żądania adresu URL (URI) i wysyła żądanie do systemu plików i jest albo spełniony lub zgłasza wyjątek. Serwer WWW przetwarza następnie odpowiedź. Jeśli na przykład zostanie znaleziona żądana ścieżka i plik, a podsystem autoryzacji uzyska dostęp, serwer WWW przetwarza żądanie We / Wy w normalny sposób. Jeśli system plików zgłasza wyjątek, serwer WWW zwraca błąd 404, jeśli plik nie został znaleziony, lub błąd 403, jeśli kod przyczyny jest nieautoryzowany.

Ponieważ w niektórych systemach operacyjnych rozróżniana jest wielkość liter, a systemy plików tego typu wymagają dokładnych dopasowań, żądana ścieżka / plik serwera WWW musi dokładnie odpowiadać temu, co istnieje na dysku twardym. Powód tego jest prosty. Serwery sieciowe nie odgadują, co masz na myśli. Żaden komputer tego nie robi bez zaprogramowania. Serwery WWW po prostu przetwarzają żądania w momencie ich otrzymania. Jeśli część ścieżki / pliku żądania adresu URL przekazywana bezpośrednio do systemu plików nie pasuje do tego, co znajduje się na dysku twardym, system plików zgłasza wyjątek, a serwer WWW zwraca błąd 404 Nie znaleziono.

To naprawdę tak proste osoby. To nie jest rakieta. Istnieje bezwzględna zależność między ścieżką / częścią pliku adresu URL a systemem plików.

closetnoc
źródło
1
Myślę, że twój argument jest wadliwy. Podczas gdy Berners-Lee nie miał żadnego wyboru co do wielkości liter w adresach ftp. Musiał zaprojektować adresy URL http. Mógłby określić je tylko jako US-ASCII i bez uwzględniania wielkości liter. Jeśli kiedykolwiek istniały jakieś serwery WWW, które właśnie przekazały ścieżkę URL do systemu plików, były one niepewne, a wprowadzenie kodowania URL złamało z nimi kompatybilność. Biorąc pod uwagę, że ścieżka jest przetwarzana przed przekazaniem sprawy do rozbicia systemu operacyjnego, byłoby łatwe do wdrożenia. Dlatego uważam, że musimy traktować to jako decyzję projektową, a nie dziwactwo związane z wdrażaniem.
William Hay
@WilliamHay Nie ma to nic wspólnego z Berners-Lee ani projektowaniem Internetu. Chodzi o ograniczenia i wymagania systemu operacyjnego. Jestem emerytowanym inżynierem systemów wewnętrznych. Pracowałem wtedy nad tymi systemami. Mówię dokładnie, dlaczego w adresach URL rozróżniana jest wielkość liter. To nie jest zgadywanie. To nie jest opinia. To jest fakt. Moja odpowiedź została celowo uproszczona. Oczywiście istnieją kontrole plików i inne procesy, które można wykonać przed wydaniem jakiegokolwiek otwartego polecenia. I w rezultacie tak (!) Serwery WWW są częściowo niepewne do dnia dzisiejszego.
closetnoc
Czy w adresach URL rozróżniana jest wielkość liter, nie ma to nic wspólnego z projektowaniem sieci? Naprawdę? Argument od organu, a następnie argument przez asercję. To, że serwery sieciowe przekazują składnik ścieżki adresu URL mniej więcej bezpośrednio do otwartego wywołania, jest konsekwencją zaprojektowania adresów URL, a nie jego przyczyny. Serwery (lub inteligentni klienci w przypadku FTP) mogli ukryć rozróżnianie wielkości liter w systemach plików przed użytkownikiem. To, że nie są, jest decyzją projektową.
William Hay
@WilliamHay Musisz zwolnić kosz na trawę i ponownie przeczytać to, co napisałem. Jestem emerytowanym inżynierem systemów wewnętrznych, piszącym komponenty systemu operacyjnego, stosy protokołów i kod routera dla sieci ARPA-Net itp. Pracowałem z wewnętrznymi systemami Apache, O'Reilly i IIS. W twoim argumencie FTP nie ma wody, ponieważ co najmniej główne serwery FTP zachowują wielkość liter z tego samego powodu. Nigdy nie mówiłem nic o projektowaniu adresu URL / URI. Nigdy nie mówiłem, że serwery WWW przekazują wartości bez przetwarzania. Powiedziałem, że usługi systemu operacyjnego są powszechnie używane i że system plików wymaga dokładnego dopasowania, aby odnieść sukces.
closetnoc
@WilliamHay Proszę zrozumieć, że ty i ja myślimy o różnych celach. W mojej odpowiedzi powiedziałem tylko, że w niektórych systemach operacyjnych w wywołaniach systemu plików rozróżniana jest wielkość liter. Aplikacje korzystające z wywołań systemowych i większość z nich ogranicza się do egzekwowania reguł systemu operacyjnego - w tym przypadku rozróżniana jest wielkość liter. Ominięcie tej zasady nie jest niemożliwe. W rzeczywistości może to być nieco trywialne w niektórych przypadkach, choć niepraktyczne. W swojej pracy rutynowo omijałem system plików, aby rozszyfrować dyski twarde, które z jakiegoś powodu poszły na kablooie, lub analizować wewnętrzne pliki baz danych itp.
closetnoc
21
  1. Adresy URL podają się za lokalizator zasobów UNIFORM i mogą wskazywać na zasoby sprzed sieci. Niektóre z nich uwzględniają wielkość liter (np. Wiele serwerów ftp), a adresy URL muszą być w stanie reprezentować te zasoby w racjonalnie intuicyjny sposób.

  2. Niewrażliwość na wielkość liter wymaga więcej pracy podczas wyszukiwania dopasowania (w systemie operacyjnym lub powyżej).

  3. Jeśli zdefiniujesz adresy URL jako rozróżniane małe i wielkie litery, poszczególne serwery mogą je zaimplementować jako małe i małe litery, jeśli chcą. Odwrotna sytuacja nie jest prawdą.

  4. Niewrażliwość na wielkość liter może być nietrywialna w kontekście międzynarodowym: https://en.wikipedia.org/wiki/Dotted_and_dotless_I . Również RFC1738 zezwalał na używanie znaków spoza zakresu ASCII, pod warunkiem, że zostały one zakodowane, ale nie określiły zestawu znaków. Jest to dość ważne w przypadku czegoś, co nazywa się siecią WORLD. Zdefiniowanie adresów URL jako bez rozróżniania wielkości liter otworzyłoby wiele możliwości dla błędów.

  5. Jeśli próbujesz spakować dużo danych do identyfikatora URI (np. Identyfikator URI danych ), możesz zapakować więcej, jeśli duże i małe litery są różne.

William Hay
źródło
1
Jestem pewien, że adresy URL były historycznie ograniczone do ASCII. Jest więc mało prawdopodobne, aby internacjonalizacja była oryginalnym powodem. Historia uniksowego rozróżniania wielkości liter, OTOH, prawdopodobnie odegrała dużą rolę.
derobert
Podczas gdy tylko podzbiór ASCII może być użyty niezakodowany w adresie URL RFC1738 wyraźnie wskazuje, że znaki spoza zakresu ASCII mogą być zakodowane. Bez podania zestawu znaków nie można wiedzieć, które oktety reprezentują ten sam znak, z wyjątkiem wielkości liter. Zaktualizowano
William Hay
1
Re # 4: Tak naprawdę jest gorzej. Kropkowane i bez kropki I są demonstracją bardziej ogólnej zasady, że nawet jeśli wszystko to UTF-8 (lub jakiś inny UTF), nie możesz poprawnie pisać dużymi literami lub małymi literami bez znajomości ustawień regionalnych, do których należy tekst. W ustawieniach domyślnych duża litera łacińska I zamienia małe litery na małą literę łacińską i, co jest niepoprawne w języku tureckim, ponieważ dodaje kropkę (nie ma punktu kodowego „turecka wielka kropka I”; należy użyć kodu ASCII punkt). Rzuć różnice w kodowaniu, a to zmienia się z „naprawdę trudnego” na „całkowicie trudny”.
Kevin,
5

Ukradłem z bloga Old New Thing nawyk zbliżania się do pytań w formie „dlaczego tak się dzieje?” z pytaniem „jak wyglądałby świat, gdyby tak nie było?”

Załóżmy, że skonfigurowałem serwer WWW, aby udostępniać sobie pliki dokumentów z folderu, aby móc je czytać w telefonie, gdy byłem poza biurem. Teraz, w folderze Moje dokumenty, mam trzy pliki todo.txt, ToDo.txta TODO.TXT(wiem, ale to dla mnie sens, kiedy zrobiłem plików).

Jakiego adresu URL chciałbym użyć, aby uzyskać dostęp do tych plików? Chciałbym uzyskać do nich dostęp w intuicyjny sposób, przy użyciu http://www.example.com/docs/filename.

Powiedzmy, że mam skrypt, który pozwala mi dodać kontakt do mojej książki adresowej, co mogę zrobić również przez Internet. Jak powinno to brać jego parametry? Cóż, chciałbym go używać jak: http://www.example.com/addcontact.php?name=Tom McHenry von der O'Reilly. Ale jeśli nie byłoby sposobu, abym określił nazwę dla każdego przypadku, jak miałbym to zrobić?

Jak rozróżnić strony wiki Cat i CAT, Text i TEXT, lateks i LaTeX? Chyba disambiguje strony, ale wolę po prostu dostać to, o co prosiłem.

Ale i tak wszystko wydaje się odpowiadać na złe pytanie.

Pytanie, które, jak sądzę, naprawdę zadawałeś, brzmi: „Dlaczego serwery WWW 404 robią to tylko dla różnicy przypadków, gdy są to komputery zaprojektowane z myślą o ułatwieniu życia i doskonale potrafią znaleźć przynajmniej najbardziej oczywiste warianty przypadków w Wpisany adres URL, który zadziała? ”

Odpowiedź na to jest taka, że ​​chociaż niektóre strony to zrobiły (i lepiej sprawdzają też inne literówki), nikt nie pomyślał, że warto zmienić domyślną stronę błędu 404 serwera WWW, aby to zrobić ... ale może powinni?

Dewi Morgan
źródło
1
Niektóre strony używają pewnego rodzaju mechanizmu do konwersji dowolnego zapytania na małe litery lub coś spójnego. W pewnym sensie jest to mądre.
closetnoc
Nie powinny. Funkcjonalność ta może być i jest często dodawana, gdy jest to pożądane (np. Przez moduły w apache). Narzucenie tego rodzaju zmiany, ponieważ zachowanie domyślne - lub, co gorsza, niezmienne zachowanie - byłoby bardziej zakłócające niż stosunkowo rzadkie okazja, gdy ktoś musi ręcznie wpisać adres URL poza nazwą hosta. Na przykład, dlaczego tego nie robić, przypomnij fiasko, gdy Network Solutions „naprawiło” nieistniejące błędy domeny z publicznych zapytań DNS.
SirNickity,
@ SirNickity Nikt nie proponował niezmienności na żadnym poziomie, a strony błędów serwera są konfigurowalne na każdym serwerze, z którego kiedykolwiek korzystałem; nikt nie sugerował zastąpienia kodu 404 kodami 30 *, a raczej dodania listy linków sugestii, które można kliknąć, na stronie błędu; nazwy domen to zupełnie inny temat, w którym rozróżniana jest wielkość liter, i w innym kontekście bezpieczeństwa; a IIS już automatycznie „naprawia” (ignorując) różnice wielkości liter w ścieżce lub częściach nazw plików URI.
Dewi Morgan
Od 1996 roku Apache pozwala ci to robić za pomocą mod_speling . Po prostu nie wydaje się to zbyt popularne. Ludzie w systemach Unix / Linux postrzegają rozróżnianie wielkości liter jako regułę, a rozróżnianie wielkości liter jako wyjątek.
reinierpost
4

Chociaż powyższa odpowiedź jest poprawna i dobra. Chciałbym dodać więcej punktów.

Aby lepiej zrozumieć, należy zrozumieć podstawową różnicę między serwerem Windows Unix (Linux) a Windows. W Uniksie rozróżniana jest wielkość liter, a system Windows nie rozróżnia wielkości liter.

Protokół HTTP został opracowany lub zaczął być wdrażany około 1990 roku. Protokół HTTP został zaprojektowany przez inżynierów pracujących w instytutach CERN, przez większość dni naukowcy korzystali z maszyn uniksowych, a nie z Windows.

Większość naukowców znała Uniksa, więc mógł mieć na nie wpływ system plików w stylu Uniksa.

Serwer Windows został wydany po 2000 roku. Na długo przed tym, jak serwer Windows stał się popularny, protokół HTTP był dobrze dojrzały i specyfikacja była kompletna.

To może być powód.

Mani
źródło
2
„Serwer Windows został wydany po 2000 roku”. Zespół systemu Windows NT 3.1 nie zgodziłby się z tobą w 1993 roku. NT 3.51 w 1995 roku był prawdopodobnie wtedy, gdy NT zaczął dojrzewać i mieć ugruntowaną pozycję do obsługi aplikacji serwerowych o kluczowym znaczeniu dla biznesu.
CVn
NT 3.51 miał interfejs Win 3.1. System Windows nie wystartował tak naprawdę, dopóki system Windows 95 nie wymagał NT 4.0, aby uzyskać ten sam interfejs.
Thorbjørn Ravn Andersen
Zgadza się Michael Kjörling. Pozwól mi to zmodyfikować.
Mani
1
@ ThorbjørnRavnAndersen Na rynku serwerów NT 3.51 odniósł spory sukces. Na rynku konsumenckim / prosumenckim minęło aż Windows 2000 (NT 5.0), zanim linia NT zaczęła zyskiwać poważną przyczepność.
CVn
Rzeczywiście, WorldWideWeb został początkowo opracowany na systemach opartych na Uniksie, które mają systemy plików z rozróżnianiem wielkości liter i większość adresów URL mapowanych bezpośrednio na pliki w systemie plików.
reinierpost
4

Jak należy przeczytać „dlaczego tak zostało zaprojektowane?” pytanie? Czy pytasz o historycznie dokładny opis procesu decyzyjnego, czy pytasz „dlaczego ktoś miałby to tak zaprojektować?”?

Bardzo rzadko można uzyskać historycznie dokładne konto. Czasami, gdy decyzje podejmowane są w komitetach normalizacyjnych, istnieje dokumentalna ścieżka prowadząca debatę, ale we wczesnych dniach Internetu decyzje podejmowane były w pośpiechu przez kilka osób - w tym przypadku prawdopodobnie przez samego TimBL - a uzasadnienie jest mało prawdopodobne zostać spisane. Ale TimBL przyznał, że popełnił błędy w projektowaniu adresów URL - patrz http://www.dailymail.co.uk/sciencetech/article-1220286/Sir-Tim-Berners-Lee-admits-forward-slashes-web-address -mistake.html

Na początku adresy URL były mapowane bardzo bezpośrednio na nazwy plików, a pliki były na ogół na komputerach z systemem uniksowym, a na maszynach z systemem uniksowym rozróżniane są wielkie i małe litery. Domyślam się, że stało się tak dla wygody implementacji, a użyteczność (dla użytkowników końcowych) nigdy nie była brana pod uwagę. Znów na początku wszyscy użytkownicy byli programistami uniksowymi.

Michael Kay
źródło
Użytkownicy końcowi również byli użytkownikami Uniksa (niekoniecznie programiści, ale fizycy o wysokiej energii i tym podobne), więc oni również byli przyzwyczajeni do braku wrażliwości na wielkość liter.
reinierpost
3

Nie ma to nic wspólnego z miejscem zakupu domeny, w systemie DNS nie jest rozróżniana wielkość liter. Ale system plików na serwerze, którego używasz do hostingu, to.

To naprawdę nie jest problem i jest dość powszechny na hostach * nix. Upewnij się tylko, że wszystkie linki, które piszesz na swoich stronach, są prawidłowe i nie będziesz mieć problemu. Aby to ułatwić, zalecamy zawsze nazywać swoje strony małymi literami, wtedy nie trzeba dwukrotnie sprawdzać nazwy podczas pisania linku.

adnan3344
źródło
2

Closetnoc ma rację co do systemu operacyjnego. Niektóre systemy plików traktują tę samą nazwę z inną obudową jak różne pliki.

Ponadto, czy istnieje rzeczywisty cel / korzyść posiadania adresu URL z rozróżnianiem wielkości liter (w przeciwieństwie do zdecydowanej większości adresów URL, które prowadzą do tej samej strony bez względu na wielkie litery)?

Tak. aby uniknąć powielania problemów z treścią.

Jeśli masz na przykład następujące adresy URL:

http://example.com/page-1
http://example.com/Page-1
http://example.com/paGe-1
http://example.com/PAGE-1
http://example.com/pAGE-1

i wszystkie wskazywały na dokładnie tę samą stronę z dokładnie taką samą treścią, wówczas powielalibyśmy treść, i jestem pewien, że jeśli masz konto w konsoli wyszukiwania Google (narzędzia dla webmasterów), Google to ci wskaże.

Sugeruję, aby zrobić, jeśli jesteś w takiej sytuacji, aby użyć wszystkich małych adresów URL, a następnie przekieruj adresy URL zawierające co najmniej jedną wielką literę do wersji z małymi literami. Na powyższej liście adresów URL przekieruj wszystkie adresy URL na pierwszy adres URL.

Mikrofon
źródło
„Tak., Aby uniknąć powielania problemów z treścią”. - Ale odwrotnie wydaje się być prawdą? Fakt, że w adresach URL rozróżniana jest wielkość liter (i tak traktują je wyszukiwarki), powoduje zduplikowane problemy z treścią, o których wspominasz. Gdyby adresy URL były bez rozróżniania wielkich i małych liter, nie byłoby problemów ze zduplikowanymi treściami z różną wielkością liter. page-1byłby taki sam jak PAGE-1.
MrWhite
Myślę, że zła konfiguracja serwera może powodować zduplikowanie treści, jeśli chodzi o obudowę. Na przykład, instrukcja RewriteRule ^request-uri$ /targetscript.php [NC]zapisana w pliku .htaccess będzie pasować http://example.com/request-uri, a http://example.com/ReQuEsT-Uriponieważ [NC]wskazuje, że obudowa nie ma znaczenia przy ocenie, że jednym wyrażeniem regularnym.
Mike
1

Rozróżnianie wielkości liter ma wartość.

Jeśli jest 26 liter, każda z możliwością wielkich liter, to 52 znaki.

4 znaki mają możliwość kombinacji 52 * 52 * 52 * 52, co daje 7311616 kombinacji.

Jeśli nie możesz użyć wielkich liter, liczba kombinacji wynosi 26 * 26 * 26 * 26 = 456976

Istnieje ponad 14 razy więcej kombinacji dla 52 znaków niż dla 26. Tak więc do przechowywania danych, adresy URL mogą być krótsze i więcej informacji może być przesyłanych przez sieci z mniejszą liczbą przesyłanych danych.

Właśnie dlatego youtube używa adresów URL takich jak https://www.youtube.com/watch?v=xXxxXxxX

Michael d
źródło