Como decodificar um caractere de escape reservado em um URI de solicitação em um servidor Web?
É bastante claro que um servidor da Web precisa decodificar qualquer caractere não reservado que não seja salvo (como alfanuméricos, etc.) para fazer a comparação do URI. Por exemplo,http://www.example.com/~user/index.htm
deve ser idêntico ahttp://www.example.com/%7Euser/index.htm
.
Minha pergunta é: o que vamos fazer com os caracteres reservados que escapara
Um exemplo seria%2F
ou/
. Se houver um%2F
no URI da solicitação, caso o analisador do servidor da Web o substitua por um/
? No exemplo acima, isso significa quehttp://www.example.com/~user%2Findex.htm
seria o mesmo quehttp://www.example.com/~user/index.htm
? Embora eu tenha tentado em um servidor Apache (2.2.17 Unix) e parece que ele dá um erro "404 não encontrado"
Então isso significa%2F
e outros caracteres reservados escapados devem ser deixados em paz (pelo menos antes da comparação de URI
Existem dois locais no RFC 2616 (HTTP 1.1) que mencionam o problema de decodificação de escape:
O Request-URI é transmitido no formato especificado na seção 3.2.1. Se o URI do Pedido for codificado usando a codificação "% HEX HEX" [42], o servidor de origem DEVE decodificar o URI do Pedido para interpretar adequadamente o pedido. Os servidores devem responder a solicitações de URIs inválidas com um código de status apropriad
s caracteres que não sejam os conjuntos "reservados" e "não seguros" (consulte a RFC 2396 [42]) são equivalentes à codificação ""% "HEX HEX" "
(de acordo comhttp: //trac.tools.ietf.org/wg/httpbis/trac/ticket/ "inseguro" é um erro e deve ser removido das especificações. Então, nós estamos olhando apenas para "reservado" aqui.)
FYI, a definição desses caracteres na RFC 2396:
reserved = ";" | "/" | "?" | ":" | "@" "E" | "=" "+" "!$21$!quot; | ","
unreserved = alfanum | marc
mark = "-" | "_" "." | "!" | "˜" | "*" "" "(" | ")"