Qual é a diferença entre os códigos de status HTTP 301 e 308?

137

Qual é a diferença entre HTTP 301e 308códigos de status?

  • 301 (Movido permanentemente): essa e todas as solicitações futuras devem ser direcionadas ao URI fornecido.

  • 308 (Redirecionamento permanente): a solicitação e todas as solicitações futuras devem ser repetidas usando outro URI.

Eles parecem ser semelhantes.

Alexander Drobyshevsky
fonte
Como não há código 308 em tools.ietf.org/html/rfc2616 e tools.ietf.org/html/rfc6585 , a pergunta deve ser endereçada ao inventor desse código não padrão.
KonstantinL
4
Há especificação RFC 7538, portanto, é o código HTTP reais
Alexander Drobyshevsky
2
Bem, tools.ietf.org/html/rfc7538 : Nota: Esse código de status é semelhante a 301, exceto que não permite alterar o método de solicitação de POST para GET.
9607 KonstantinL:
4
Não use o RFC 2616 como referência. Foi obsoleto pelas RFCs 7230-35.
Cassiomolin

Respostas:

257

Uma visão geral de 301, 302e307

O RFC 7231 , a referência atual para semântica e conteúdo do protocolo HTTP / 1.1, define o código de status 301(Movido permanentemente) e 302(Encontrado), que permite que o método de solicitação seja alterado de POSTpara GET. Essa especificação também define o 307código de status (Redirecionamento temporário) que não permite que o método de solicitação seja alterado de POSTpara GET.

Veja mais detalhes abaixo:

6.4.2 301 mudou-se permanentemente

O 301código de status (Movido permanentemente) indica que o recurso de destino recebeu um novo URI permanente e qualquer referência futura a esse recurso deve usar um dos URIs incluídos. [...]

Nota: Por razões históricas, um agente usuário pode alterar o método de pedido POSTpara GETo pedido posterior. Se esse comportamento for indesejado, o 307código de status (Redirecionamento temporário) pode ser usado.

6.4.3 302 Encontrados

O 302código de status (Encontrado) indica que o recurso de destino reside temporariamente em um URI diferente. Como o redirecionamento pode ser alterado ocasionalmente, o cliente deve continuar usando o URI de solicitação efetivo para solicitações futuras. [...]

Nota: Por razões históricas, um agente usuário pode alterar o método de pedido POSTpara GETo pedido posterior. Se esse comportamento for indesejado, o 307código de status (Redirecionamento temporário) pode ser usado.

6.4.7 307 Redirecionamento temporário

O 307código de status (Redirecionamento temporário) indica que o recurso de destino reside temporariamente em um URI diferente e o agente do usuário NÃO DEVE alterar o método de solicitação se ele executar um redirecionamento automático para esse URI. Como o redirecionamento pode mudar com o tempo, o cliente deve continuar usando o URI de solicitação efetivo original para solicitações futuras. [...]

Nota: Esse código de status é semelhante a 302(Encontrado), exceto que não permite alterar o método de solicitação de POSTpara GET. Esta especificação não define contrapartida equivalente para 301(Movido permanentemente) ( RFC 7238 , no entanto, define o código de status 308 (redirecionamento permanente) para esse propósito).

A necessidade de 308

O RFC 7238 foi criado para definir o 308código de status (Redirecionamento permanente), que é semelhante a 301(Movido permanentemente), mas não permite que o método de solicitação seja alterado de POSTpara GET.

O 308código de status agora é definido pelo RFC 7538 (que obsoleta o RFC 7238 ).

3. 308 redirecionamento permanente

O 308código de status (Redirecionamento permanente) indica que o recurso de destino recebeu um novo URI permanente e quaisquer referências futuras a esse recurso devem usar um dos URIs incluídos. Clientes com recursos de edição de link devem vincular automaticamente automaticamente as referências ao URI de solicitação efetivo a uma ou mais das novas referências enviadas pelo servidor, sempre que possível. [...]

Nota: Esse código de status é semelhante a 301(Movido permanentemente), exceto pelo fato de não permitir alterar o método de solicitação de POSTpara GET.

Se temos o seguinte:

                                                             +-----------+-----------+
                                                             | Permanent | Temporary |
+------------------------------------------------------------+-----------+-----------+
| Allows changing the request method from POST to GET        | 301       | 302       |
+------------------------------------------------------------+-----------+-----------+
| Doesn't allow changing the request method from POST to GET | 308       | 307       |
+------------------------------------------------------------+-----------+-----------+

Escolhendo o código de status mais adequado

Michael Kropat montou um conjunto de gráficos de decisão que ajudam a determinar o melhor código de status para cada situação. Consulte o seguinte para 2xxe 3xxcódigos de status:

Escolhendo um código de status 2xx ou 3xx

cassiomolin
fonte
3
Dado que a pergunta era especificamente sobre a distinção entre 301 e 308, você poderia dar mais explicações sobre: "não permite que o método de solicitação seja alterado de POSTpara GET" ? Significaria que um formulário postado não pode ser processado, mas um novo formulário novo poderia ser serverd e, em seguida, publicado em uma próxima solicitação?
R. Schreurs
1
Este rascunho de especificação ( tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html ) sugere que os serviços ReSTful devem usar 308 mesmo para GETs. "Os códigos de redirecionamento HTTP 301-306 NÃO DEVEM ser usados, a menos que o provedor de serviços esteja ciente de que o cliente é de fato um agente do usuário." No entanto, este é apenas um rascunho. Não tenho certeza se / quando será aceito.
Bruce Adams
1
Esta postagem, o guia definitivo para obter e publicar , esclarece por que permitir que uma POSTsolicitação (segura) seja alterada para uma para GET(insegura em que os dados são passados ​​adicionando-os ao URL - e os URLs podem ser salvos - incluindo senhas) A solicitação pode ser um problema de segurança e geralmente deve ser evitada, a menos que você saiba que é seguro mudar. Atualmente, parece que geralmente é suportado e prefere usar 307, 308 em vez de 301, 302. Mas você deve verificar.
SherylHohman 18/06
1
O Mnemonic 308é como um infinito lateral, portanto, o redirecionamento permanente e também nunca altera o método de solicitação - também é um tipo de solicitação fixo permanente. A seguir, 307veja o 1passo abaixo - Método de solicitação permanente / manutenção (Get / Post), mas redirecione para um local temporário: 7 - parece "curva à esquerda" ou desvio temporário, e 7 também é semelhante à k, portanto, "mantenha" o método de solicitação.
SherylHohman 18/06
Você esqueceu de mencionar Retomar incompleto .
Knu 13/07