HTTP / Redirecionando para um URI no servidor

3

Eu quero redirecionar um determinado URI para um novo no mesmo servidor. Isso pode ser feito enviando uma resposta com um código 3xx e um cabeçalho "Local". Agora, o padrão HTTP / 1.1 determina que isso deve ser um 'URI absoluto'. (consulte link )

Agora, o que exatamente eles querem dizer com "URI absoluta"? No exemplo dado, eles incluíram o URI completo, com o protocolo, o nome do host e o caminho. Agora quero redirecionar para um URI no mesmo servidor e conheço o caminho. É um URI absoluto (inicia na raiz), mas sem nome de host e protocolo. De fato, o servidor pode não conhecer seu próprio nome de host, e seria difícil construir um URI completo.

Também é válido, de acordo com o padrão HTTP / 1.1, enviar um URI sem nome de host e protocolo? Eu tentei isso, e todos os navegadores que testei pareciam entendê-lo. Minha pergunta é: é correto fazer isso?

Um exemplo de resposta:

HTTP/1.1 303 See Other
Location: /path/to/other

Em vez de:

HTTP/1.1 303 See Other
Location: https://hostname.com/path/to/other
    
por Ruud 29.12.2011 / 07:49

2 respostas

3

Is it also valid, according to the HTTP/1.1 standard, to send a URI [in a location header] without hostname and protocol?

Não, por causa de como 'absoluteURI' é definido. Já que você está olhando para uma RFC, vamos nos ater a essa discussão. Backup:

Now what exactly do they mean by 'absolute URI'?

Está definido em outro lugar. Isso acontece frequentemente .

Now I want to redirect to a URI on the same server, and I know the path. It is an absolute URI (it starts at the root), but without hostname and protocol.

Pode ser um caminho absoluto , mas isso não o torna um absoluto URI .

Da seção 3.2.1 da RFC HTTP / 1.1, Sintaxe Geral:

For definitive information on URL syntax and semantics, see "Uniform Resource Identifiers (URI): Generic Syntax and Semantics," RFC 2396 [42] (which replaces RFCs 1738 [4] and RFC 1808 [11]). This specification adopts the definitions of "URI-reference", "absoluteURI", "relativeURI", "port", "host","abs_path", "rel_path", and "authority" from that specification.

Olhando para RFC 2396 :

   absoluteURI   = scheme ":" ( hier_part | opaque_part )

Mesmo sem mergulhar através do BNF, a parte 'esquema' (o 'http' ou 'https') é necessária. Vou omitir uma discussão real sobre a criação de regras aqui, mas como você precisa de um 'http:' ou 'https:' no início da string, não é possível remover a parte da rede do URI.

I tried this, and every browser I tested seemed to understand it.

A lei de Postel no trabalho. Você fez algo errado, mas o navegador entendeu mesmo assim. Você deve segui-lo e enviar um URI absoluto correto com o cabeçalho Location: . Se não puder ser construído facilmente em seu ambiente, há algo errado; Não consigo pensar em nenhum aplicativo da web que vi onde as informações do host não são configuráveis ou recuperáveis.

    
por 29.12.2011 / 09:19
2

Parece que eles não disseram explicitamente se você deve incluir o nome e o protocolo do servidor. Se você souber quem usará seu serviço HTTP, basta testá-lo e ver se tudo corre bem.

Além disso, não é difícil saber o URL solicitado no servidor e construir um URL absoluto que inclua o protocolo e o nome do host. Por exemplo, você pode usar a matriz $_SERVER no PHP. Outras linguagens da web devem ter variáveis predefinidas semelhantes.

    
por 29.12.2011 / 09:05

Tags