O URL deve diferenciar maiúsculas de minúsculas?

284

eu percebi isso

HTTP://STACKOVERFLOW.COM/QUESTIONS/ASK

e

http://stackoverflow.com/questions/ask

ambos funcionam bem - na verdade, o anterior é convertido para minúsculas.

Eu acho que isso faz sentido para o usuário.

Se eu olhar o Google, esse URL funcionará bem:

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

mas este com "SOBRE" não está funcionando:

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

O URL deve diferenciar maiúsculas de minúsculas?

Imageree
fonte
13
IMHO, o URL nunca deve diferenciar maiúsculas de minúsculas, isso está dificultando a vida das pessoas que o usarão.
Muhammad Umer
16
A pergunta "Os URLs diferenciam maiúsculas de minúsculas?" é uma pergunta ruim porque invoca opinião. Em vez disso, uma pergunta melhor seria: "POR QUE (ou NÃO) os URLs diferenciam maiúsculas de minúsculas?" Ou "Por que alguns URLs diferenciam maiúsculas de minúsculas, enquanto outros não?"
chharvey
Mas para uma resposta possível, veja a nova URL padrão do WHATWG , que tem sido adotado por node.js .
chharvey
na minha opinião, não, eles não deve ser
Andrew
se o navegador não honrar o caso, IPFs endereço será quebrado, mas ele não está quebrado
Beeno Tung

Respostas:

281

De acordo com " HTML e URLs " do W3, eles deveriam:

Pode haver URLs, ou partes de URLs, onde o caso não importa, mas identificá-las pode não ser fácil. Os usuários sempre devem considerar que os URLs diferenciam maiúsculas de minúsculas.

jldupont
fonte
95
Eu acho que "seja liberal no que você aceita e conservador no que você envia" (IETF fala) seria a minha orientação.
Jdupont #
9
A diretriz W3 é razoável. Simplesmente afirma que não se deve assumir como o servidor lida com o URL que você está enviando. Cabe ao servidor como lidar com o URL da solicitação. A maioria dos servidores web é unix / linux e isso significa que a maioria dos servidores web faz distinção entre maiúsculas e minúsculas.
oᴉɹǝɥɔ
37
O W3 diz que os USUÁRIOS devem assumir que os servidores diferenciam maiúsculas de minúsculas, mas não dão uma recomendação para os SERVIDORES.
trysis
3
Para resiliência, os programas que interpretam URLs devem tratar letras maiúsculas como equivalentes a letras minúsculas nos nomes dos esquemas (por exemplo, permita "HTTP" e "http"). Fonte
realPK 01/07/16
3
@PK_ Observe que isso vale apenas para a parte do esquema da URL. O RFC1738 não discute se outras partes da URL devem ser interpretadas como maiúsculas ou minúsculas.
Dthrasher 27/10/16
126

Todos os " insensíveis " estão em negrito para facilitar a leitura.

Os nomes de domínio não diferenciam maiúsculas de minúsculas, de acordo com a RFC 4343 . O restante da URL é enviado ao servidor através do método GET. Isso pode fazer distinção entre maiúsculas e minúsculas ou não.

Por exemplo, nesta página, o stackoverflow.com recebe GET string / questions / 7996919 / deve diferenciar maiúsculas de minúsculas , enviando um documento HTML para o navegador. Stackoverflow.com não faz distinção entre maiúsculas e minúsculas, porque produz o mesmo resultado para / QUEStions / 7996919 / Deve ser sensível a maiúsculas e minúsculas .

Por outro lado, a Wikipedia diferencia maiúsculas de minúsculas, exceto o primeiro caractere do título. Os URLs https://en.wikipedia.org/wiki/Case_sensitivity e https://en.wikipedia.org/wiki/case_sensitivity levam ao mesmo artigo, mas https://en.wikipedia.org/wiki/CASE_SENSITIVITY retorna 404

jdh8
fonte
7
A Wikipedia realmente perdoa a distinção entre maiúsculas e minúsculas nos casos em que os usuários pensam que uma palavra deve ser um caso ou outro, mas isso é mais por causa do TOC ... desculpe a natureza atenciosa de seus editores. Seus URLs são tecnicamente sensíveis a maiúsculas e minúsculas.
trysis
14
Isso ocorre porque a parte semântica e legível da URL de uma pergunta no stackoverflow não a identifica, é identificada por 7996919. A parte semântica da URL está lá apenas para fins de SEO.
precisa saber é o seguinte
4
Na verdade, também funciona /programming/7996919/should-BLABLA-be-or-NOT-to-be . Isso ocorre porque o servidor da stackoverflow.com usa apenas o ID da pergunta para identificá-lo e retornar a URL e a página HTML corretas.
Bozzy
72

Depende do sistema operacional de hospedagem. Os sites hospedados no Windows tendem a não fazer distinção entre maiúsculas e minúsculas, pois o sistema de arquivos subjacente não faz distinção entre maiúsculas e minúsculas. Os sites hospedados em sistemas do tipo Unix tendem a fazer distinção entre maiúsculas e minúsculas, pois seus sistemas de arquivos subjacentes geralmente diferenciam maiúsculas de minúsculas. A parte do nome do host da URL sempre diferencia maiúsculas de minúsculas; o resto do caminho varia.

Jim Nutt
fonte
1
Sim, como este encontrado dolorosamente em solicitações HTTP para arquivos em um servidor FTP Unix.
Laurie Stearn
1
Seria mais preciso dizer 'depende do servidor' no sentido geral - porque servir arquivos não é a única maneira de responder a solicitações HTTP.
Valentin Waeselynck,
31

A parte do nome de domínio de uma URL não diferencia maiúsculas de minúsculas, pois o DNS ignora maiúsculas http://en.example.org/e minúsculas: e HTTP://EN.EXAMPLE.ORG/ambas abrem a mesma página.

O caminho é usado para especificar e talvez encontrar o recurso solicitado. Faz distinção entre maiúsculas e minúsculas, embora possa ser tratado como sem distinção entre maiúsculas e minúsculas por alguns servidores, especialmente aqueles baseados no Microsoft Windows.

Se o servidor faz distinção entre maiúsculas e minúsculas e http://en.example.org/wiki/URLestá correto, então http://en.example.org/WIKI/URLou http://en.example.org/wiki/urlexibirá uma página de erro HTTP 404, a menos que esses URLs apontem para recursos válidos.

Bhavin Shah
fonte
3
Esta resposta tem a única redação correta "diferencia maiúsculas de minúsculas, embora possa ser tratada como não diferencia maiúsculas de minúsculas". Apenas resposta válida.
Daniel W.
@DanFromGermany, o caminho diferencia maiúsculas de minúsculas pode ser deduzido vagamente daqui "URLs geralmente diferenciam maiúsculas de minúsculas (com exceção dos nomes de máquinas). Pode haver URLs ou partes de URLs, onde maiúsculas e minúsculas não importam, mas identificar isso pode não ser fácil ". Mas, é ambíguo deduzir isso. Como mencionado em um comentário acima, o RFC1738 não discute se partes do URL que não sejam o esquema devem ser interpretadas como maiúsculas ou minúsculas. Você tem algum link que esclarece quais partes do URL diferenciam maiúsculas de minúsculas?
granada
2
@garnet Do RFC3986 6.2.2.1. Normalização de Caso : Quando um URI usa componentes da sintaxe genérica, as regras de equivalência de sintaxe do componente sempre se aplicam; ou seja, que o esquema e o host não diferenciam maiúsculas de minúsculas e, portanto, devem ser normalizados para minúsculas. Por exemplo, o URI HTTP://www.EXAMPLE.com/é equivalente a http://www.example.com/. Os outros componentes genéricos da sintaxe são considerados sensíveis a maiúsculas e minúsculas, a menos que especificamente definidos de outra forma pelo esquema. "
Daniel W.
2
@garnet E do HTTP RFC : " Ao comparar dois URIs para decidir se eles correspondem ou não, um cliente DEVE usar uma comparação de octeto por octeto com distinção entre maiúsculas e minúsculas de todos os URIs [...] " (com exceção do esquema e hospedar-se).
Daniel W.
15

Não sou fã de artigos antigos, mas como essa foi uma das primeiras respostas para esse problema em particular, senti a necessidade de esclarecer alguma coisa.

Como a resposta do @Bhavin Shah afirma que a parte do domínio do URL não diferencia maiúsculas de minúsculas,

http://google.com 

e

http://GOOGLE.COM 

e

http://GoOgLe.CoM 

são todos iguais, mas tudo depois da parte do nome de domínio é considerado sensível a maiúsculas e minúsculas.

tão...

http://GOOGLE.COM/ABOUT

e

http://GOOGLE.COM/about

são diferentes.

Nota: estou falando "tecnicamente" e não "literalmente" em muitos casos, na maioria dos casos, os servidores são configurados para lidar com esses itens da mesma forma, mas é possível configurá-los para que NÃO sejam tratados da mesma forma.

Servidores diferentes lidam com isso de maneira diferente e, em alguns casos, precisam ser sensíveis a maiúsculas e minúsculas. Em muitos casos, os valores de sequência de consulta são codificados (como IDs de sessão ou dados codificados em Base64 passados ​​como um valor de sequência de consulta) Esses itens diferenciam maiúsculas de minúsculas por natureza e, portanto, o servidor precisa diferenciar maiúsculas de minúsculas ao manipulá-los.

Portanto, para responder à pergunta, os servidores "deveriam" fazer distinção entre maiúsculas e minúsculas ao coletar esses dados, a resposta é "sim, definitivamente".

É claro que nem tudo precisa fazer distinção entre maiúsculas e minúsculas, mas o servidor deve estar ciente do que é e como lidar com esses casos.


O comentário de @Hart Simha diz basicamente a mesma coisa. Perdi antes de publicar, então quero dar crédito onde o crédito é devido.

Kenneth Garza
fonte
7

Veja a especificação aqui: seção 2.7.3 http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-25#page-19

O esquema e o host não diferenciam maiúsculas de minúsculas e normalmente são fornecidos em letras minúsculas; todos os outros componentes são comparados com distinção entre maiúsculas e minúsculas.

Nitin
fonte
3

Considere o seguinte:

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

Neste exemplo hipotético, um formulário HTML - usando o método GET - envia o parâmetro "name" para um script PHP que cria uma nova conta de usuário.

E o argumento que estou enfatizando neste exemplo é que esse parâmetro GET precisa ser sensível a maiúsculas e minúsculas para preservar a capitalização de "McCartney" (ou, como outro exemplo, preservar "Walter d'Isney", pois existem outras maneiras. para que os nomes violem as regras usuais de capitalização).

São casos como esses que orientam a recomendação do W3C de que o esquema e o host não diferenciam maiúsculas de minúsculas, mas tudo depois disso é potencialmente sensível a maiúsculas e minúsculas - e é deixado para o servidor. Forçar a distinção entre maiúsculas e minúsculas por padrão tornaria o exemplo acima incapaz de preservar o caso de entrada do usuário transmitida como um parâmetro de consulta GET.

Mas o que eu diria é que, embora essa seja necessariamente a letra da lei para acomodar esses casos, o espírito da lei é que, quando o caso é irrelevante, se comporta de maneira insensível ao caso. Os padrões, no entanto, não podem dizer onde o caso é irrelevante porque, como nos exemplos que dei, é algo dependente do contexto.

(por exemplo, um nome de usuário da conta provavelmente é melhor forçado a não diferenciar maiúsculas e minúsculas - como "Usuário123" e "usuário123" sendo contas diferentes podem ser confusas - mesmo que seu nome real, como acima, seja mais sensível a maiúsculas e minúsculas.)

Às vezes é relevante, na maioria das vezes não é. Mas deve ser deixado ao servidor / desenvolvedor da web decidir essas coisas - e não pode ser prescrito por padrão -, pois somente nesse nível o contexto poderia ser conhecido.

O esquema e o host não diferenciam maiúsculas de minúsculas (o que mostra a preferência do padrão pela diferenciação de maiúsculas e minúsculas, onde pode ser universalmente prescrito). O resto fica por sua conta, pois você entende melhor o contexto. Mas, como foi discutido, você provavelmente deve, no espírito da lei, usar como padrão a insensibilidade ao caso, a menos que tenha um bom motivo para não fazê-lo.

Prumo
fonte
As cadeias de consulta são tratadas como parte do local? Eu acredito que eles são tratados como entidades separadas e não usados ​​para resolução de local.
jpmc26
As cadeias de consulta são separadas da localização, sim. Mas os mesmos princípios que mostrei aqui com parâmetros de consulta também podem ser aplicados a outras partes do URL. Alguns CMSes, por exemplo, podem reescrever propositalmente "/user.php?id=3756" para "/ users / PaulMcCartney" para obter melhores URLs legíveis por humanos e amigáveis ​​ao SEO (o Wordpress faz isso, por exemplo). O ponto é que os padrões deliberadamente se afastam da prescrição sobre o que depende do contexto. Cabe ao servidor decidir, como o servidor entende o contexto, onde um padrão universal não pode.
Bob
2

Os URLs não diferenciam maiúsculas de minúsculas, a menos que exista uma boa razão pela qual não o sejam.

Isso não é obrigatório (não faz parte de uma RFC), mas torna a comunicação e o armazenamento de URLs muito mais confiáveis.

Se eu tiver duas páginas em um site:

http://stackoverflow.com/ABOUT.html

e

http://stackoverflow.com/about.html

Como eles devem diferir? Talvez alguém esteja escrito 'estilo de gritar' (caps) - mas, do ponto de vista da IA, a distinção nunca deve ser feita por uma alteração no caso da URL.

Além disso, é fácil implementar isso no Apache - basta usar a CheckSpelling Onpartir de mod_Speling.

konchog
fonte
0

Pergunta antiga, mas eu tropecei aqui, então por que não tentar? Uma vez que a pergunta está buscando várias perspectivas e não uma resposta definitiva.

O w3c pode ter suas recomendações - das quais me importo muito -, mas quero repensar, já que a questão está aqui.

Por que o w3c considera que os nomes de domínio não fazem distinção entre maiúsculas e minúsculas e deixam algo depois sem diferenciação de maiúsculas e minúsculas?

Eu estou pensando que a lógica é que a parte do domínio da URL é digitada manualmente por um usuário. Tudo após o hipertexto será resolvido pela máquina (navegador e servidor na parte de trás).

As máquinas podem lidar melhor com a insensibilidade do caso do que com os humanos (não do tipo técnico :)).

Mas a questão é apenas porque as máquinas PODEM lidar com isso, devem ser feitas dessa maneira?

Quero dizer, quais são os benefícios de nomear e acessar um recurso em hereIsTheResourcevs hereistheresource?

A lateral é muito ilegível que a do camelo, que é mais legível. Legível para seres humanos (incluindo o tipo técnico).

Então, aqui estão os meus pontos: -

O Caminho do Recurso fica em algum lugar no meio da estrutura de programação e, por vezes, fica perto de um usuário final atrás do navegador.

Seu URL (excluindo o nome do domínio) não faz distinção entre maiúsculas e minúsculas, caso se espere que os usuários o digitem, etc. Você deve desenvolver seu aplicativo para EVITAR que os usuários digitem o caminho o máximo possível.

Seu URL (excluindo o nome do domínio) deve diferenciar maiúsculas de minúsculas se seus usuários nunca o digitarem manualmente.

Conclusão

O caminho deve fazer distinção entre maiúsculas e minúsculas. Meus pontos estão pesando para os caminhos sensíveis a maiúsculas e minúsculas.

bhantol
fonte
0

Os caracteres de URL são convertidos em código hexadecimal (se você já notou espaços nos URLs sendo exibidos como% 20 etc.) e, como as letras maiúsculas e minúsculas têm valores hexadecimais diferentes, faz todo o sentido que os URLs sejam definitivamente mais sensíveis a maiúsculas e minúsculas. No entanto, o espírito da pergunta parece ser o padrão e eu digo não, mas eles são. Cabe ao desenvolvedor / provedor responder por isso em seu código, se quiser que ele funcione independentemente do usuário final.

Convidado
fonte
Isso é interessante. caracteres regulares e ASCII (que têm maiúsculas e minúsculas) não são realmente convertidos, apesar de certo? são apenas espaços e caracteres estendidos que escapam no URL. Algum caractere estendido possui um modificador de maiúsculas / minúsculas?
TygerKrash
0

Penso que esta e muitas das respostas sobre o que as especificações dizem ou não estão perdendo o objetivo da pergunta. Eles devem diferenciar maiúsculas de minúsculas? Essa é uma pergunta realmente carregada. Do ponto de vista de um usuário, a distinção entre maiúsculas e minúsculas é um ponto problemático, nem todos sabem que faz diferença. A questão de saber se os URIs devem ou não ser, depende do contexto da pergunta. Para flexibilidade técnica, sim, deveriam ser. Para usabilidade, não, eles não deveriam ser.

rspring1975
fonte
Para ser justo, qualquer pergunta que faça "DEVE" é inerentemente baseada em opiniões e pode ser removida do StackOverflow. (Mais: stackoverflow.blog/2010/09/29/good-subjective-bad-subjective )
chharvey
0

Preservação de caso

URLs preservam maiúsculas e minúsculas , entre cliente e servidor. Mas partes de URLs podem ou não fazer distinção entre maiúsculas e minúsculas , dependendo do servidor, por alguns motivos.

Sensibilidade do caso

As seguintes partes em negrito dos URLs podem fazer distinção entre maiúsculas e minúsculas, dependendo do site e / ou da configuração do servidor.

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

    usuário @ example.com

Fundamentação

A distinção entre maiúsculas e minúsculas nos URLs pode ter vários usos. Principalmente:

  1. Compatibilidade nativa com sistemas de arquivos que diferenciam maiúsculas de minúsculas.
  2. Codificação de dados mais compacta em URLs, como serialização, hash, IDs, links permanentes e encurtadores de URL.

Como desenvolvedor, acredito que o acima pode ser tratado de maneiras melhores, mas também entendo que há casos em que uma situação pode não permitir isso.

Por exemplo, imagine um produto existente que exija muitos dados inseridos no URL "GET", mas ele deve ser compatível com os comprimentos máximos de URL de todos os principais servidores, navegadores e mecanismos de cache / proxy. Para ajustar até mesmo uma cadeia de comandos de tamanho moderado (abaixo de 1.024 caracteres para alguns navegadores mais antigos), você precisa usar todos os caracteres seguros para URL exclusivos que puder (que é basicamente o que é a codificação base64url).

Em um mundo ideal

Se os URLs devem ou não fazer distinção entre maiúsculas e minúsculas é discutível. Pessoalmente, acredito que não devem ser, por simplicidade (embora possa criar URLs mais longos, temos escapes percentuais para lidar facilmente com casos em que devemos garantir a preservação de caracteres exatos e existem maneiras de transferir dados além do correto no URL) .

Muitos parecem concordar com base no fato de que URLs sem distinção entre maiúsculas e minúsculas são ativadas explicitamente para muitos sites e serviços populares, a fim de aumentar a usabilidade. O exemplo mais destacado é a parte do nome de usuário dos endereços de email. A maioria dos provedores de email ignora letras maiúsculas e minúsculas e, às vezes, até pontos e outros símbolos (como "[email protected]" sendo o mesmo que "[email protected]"). Mesmo que os nomes de usuário de e-mail sejam sensíveis a maiúsculas e minúsculas por padrão, de acordo com as especificações.

No entanto, o fato é que, apesar do que eu ou outros possamos querer, esse é o estado de como as coisas funcionam atualmente. E, embora uma eventual transição mundial para um padrão de URL que não diferencia maiúsculas de minúsculas seja certamente possível, provavelmente levaria um longo tempo, já que a distinção entre maiúsculas e minúsculas é atualmente usada extensivamente na Web para vários propósitos.

Melhores Práticas

No que diz respeito às práticas recomendadas, como usuário, você pode razoavelmente ficar em minúsculas na maioria das situações e esperar que as coisas funcionem. As principais exceções seriam URLs que usam codificação baseada em casos ou caminhos de documentos com equivalentes diretos ao sistema de arquivos. No entanto, esses URLs complexos geralmente são copiados e colados (ou simplesmente clicados) em vez de digitados manualmente.

Como desenvolvedor da web, considere manter os URLs sem distinção entre maiúsculas e minúsculas quanto possível. Embora haja claramente algumas situações difíceis de evitar, dependendo do contexto, conforme observado acima.

Beejor
fonte
-1

a pergunta é: o URL diferencia maiúsculas de minúsculas?

Não vejo utilidade ou boa prática por trás de URLs que diferenciam maiúsculas de minúsculas. É estúpido, é péssimo e deve ser evitado o tempo todo.

Apenas para fazer backup da minha opinião, quando alguém pergunta qual URL, como você pode explicar quais caracteres do URL são Maiúsculas ou Minúsculas? Isso é um absurdo e ninguém deveria lhe dizer o contrário.

HenriKoppen
fonte
32
Há uma vantagem dos URLs diferenciarem maiúsculas de minúsculas. Em alguns sites, em que os objetos são codificados com IDs exclusivos que podem ser consultados por meio da URL, a codificação pode ser algo como base64 em vez de base36 . Isso permite codificar exponencialmente mais objetos exclusivos no mesmo número de caracteres de URL. Por exemplo, foo.com/000 - foo.com/zzz (não faz distinção entre maiúsculas e minúsculas) pode se referir a 36 ^ 3 objetos únicos, onde foo.com/000 - foo.com/ZZZ (diferencia maiúsculas de minúsculas, significando foo.com/zzz e foo.com/ZZZ são caminhos diferentes), se refeririam a 62 ^ 3 objetos.
Hart Simha 10/09
6
Esta não é uma resposta, é um comentário opinativo.
the Tin Man
1
Apoio com um exemplo. Os URLs são usados ​​por pessoas - veja a pergunta original - e não por computadores. É muito difícil, então veja POR QUE um link não está funcionando e como quase TODOS os domínios não diferenciam maiúsculas de minúsculas, o restante da URL também deve ser. Os votos negativos são para o meu tom de voz (o que é ruim) ou porque as pessoas técnicas tendem a escolher a beleza técnica em detrimento da experiência do usuário.
HenriKoppen 20/08/16
1
@theTinMan É uma resposta para a pergunta que evoca opiniões.
chharvey
Eu concordo com o @HartSimha e, como a pergunta pede opinião: a menos que parte da rota da URL esteja sendo usada para identificar um objeto único, por favor, pelo amor de tudo que é bom na Internet, NÃO faça distinção entre maiúsculas e minúsculas.
jaybro
-3

Para sites hospedados em um servidor Linux, o URL diferencia maiúsculas de minúsculas. http://www.google.com/about e http://www.google.com/About serão redirecionados para diferentes locais. Enquanto estiver no Windows Server, o URL não diferencia maiúsculas de minúsculas, como nomear uma PASTA e será redirecionado para o mesmo local.

Vishnu
fonte
-6

É possível criar URLs não sensíveis a maiúsculas

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

Tornando o Google.com..GOOGLE.com etc direto para google.com

Renjith Gopi
fonte
Isso não responder à pergunta
monokrome
3
A pergunta é: "O URL diferencia maiúsculas de minúsculas?" Sua resposta é: "Como fazer URLs caso insensíveis"
realPK