Por que o sinal de porcentagem em um URL causa um erro de HTTP 400 Bad Request?


22

Eu me deparei com isso por acidente ao digitar incorretamente o URL de uma página da web no meu navegador.

Por que a visita http://example.com/%causa um erro HTTP 400 Bad Request a ser lançado? O servidor espera outra coisa antes ou depois do sinal de porcentagem?

Parece acontecer para servidores Apache e Nginx.


Respostas:


32

Resposta curta

Conforme a RFC 3986 , um %caractere simples não é uma sintaxe válida de URI ; deve ser seguido por dois dígitos hexadecimais significativos .

Resposta longa

O código de status HTTP que você obteve pertence à 4xxclasse:

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

Origem: Registro de Código de Status HTTP (Hypertext Transfer Protocol)

Em particular, o código 400é definido pela Internet Engineering Task Force (IETF) na RFC 2616:

10.4.1 400 Solicitação incorreta

A solicitação não pôde ser entendida pelo servidor devido à sintaxe incorreta. O cliente não deve repetir o pedido sem modificações.

Fonte: RFC 2616 - Protocolo de transferência de hipertexto - HTTP / 1.1

Citando a Wikipedia (ênfase em negrito):

Os caracteres permitidos em um URI são reservados ou não reservados ( ou um caractere de porcentagem como parte de uma codificação de porcentagem ).

Origem: porcentagem de codificação - porcentagem de codificação em um URI

Se você quiser inserir um literal %símbolo, você precisa usar sua representação codificada por cento: %25.

Leitura adicional


Eu não entendo. Se eu mascarar o sinal '%' com '% 25', o arquivo ainda não será exibido, mas um erro 400 será lançado em nosso cenário (Apache -> JKMount -> Tomcat)
fiffy

Se você tiver o seguinte RewriteRule RewriteRule (.*) xyz/$1(onde xyz é qualquer nome de pasta) em .htaccess, deverá codificar duas vezes% como% 2525.
Marco Marsala

9

O sinal de porcentagem é para inserir um caractere que normalmente não é suportado no URL. Por exemplo% 20 é igual a um espaço.


4
E se inserir um caractere de porcentagem, é%25
Robotnik

A +é uma maneira de atalho para codificar um espaço. Se você deseja um sinal de mais, use seu código hexadecimal,% 2B.
Phil Perry

3
+ é a codificação correta para um espaço somente dentro de uma sequência de consultas. % 20 é a codificação correta em outra parte do URL.
Eden Townsend
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.