Diferença entre códigos de redirecionamento HTTP

151

As diferenças entre os vários códigos de redirecionamento HTTP 3XX não são claras para mim. Sim, eu li as especificações, mas parece haver alguma discrepância entre a prática padrão e a real aqui.

O 301código de redirecionamento parece claro o suficiente: isso significa que o recurso foi movido permanentemente para outro URI e solicitações futuras devem usar esse URI.

E o 307código de redirecionamento também parece claro: significa que o redirecionamento é temporário, e solicitações futuras ainda devem usar o URI original.

Mas não sei dizer qual é a diferença entre 302e 303, ou por que ambos são realmente diferentes 301. Parece que 302originalmente se destinava a ser um redirecionamento temporário , (como 307), mas, na prática, a maioria dos navegadores o tratou como a 303. Mas qual é a diferença entre a 303e a 301? É 301suposto significar que o redirecionamento é mais permanente?

Channel72
fonte

Respostas:

139
  • 301 : Redirecionamento permanente. Os clientes que fazem solicitações subsequentes para esse recurso devem usar o novo URI. Os clientes não devem seguir o redirecionamento automaticamente para solicitações POST / PUT / DELETE.
  • 302 : Redirecionar por motivo indefinido. Clientes que fazem solicitações subsequentes para esse recurso não devem usar o novo URI. Os clientes não devem seguir o redirecionamento automaticamente para solicitações POST / PUT / DELETE.
  • 303 : Redirecionar por motivo indefinido. Normalmente, 'A operação foi concluída, continue em outro lugar'. Clientes que fazem solicitações subsequentes para esse recurso não devem usar o novo URI. Os clientes devem seguir o redirecionamento para solicitações POST / PUT / DELETE, mas usar GET para a solicitação de acompanhamento .
  • 307 : Redirecionamento temporário. O recurso pode retornar a esse local posteriormente. Os clientes que fazem solicitações subsequentes para esse recurso devem usar o URI antigo. Os clientes não devem seguir o redirecionamento automaticamente para solicitações POST / PUT / DELETE.

Eu, pessoalmente, recomendo evitar 302 se você tiver a opção. Muitos clientes não seguem as especificações quando encontram um 302. Para redirecionamentos temporários, você deve usar 303 ou 307, dependendo do tipo de comportamento que deseja em solicitações não-GET. Prefira 307 a 303, a menos que você precise do comportamento alternativo em POST / PUT / DELETE.

Bob Aman
fonte
26
Não. Após um 303, é necessário reescrever o método para GET. Seguindo os outros exige manter o método, mas para confirmar com a UA se o método não é seguro (para além de opções, cabeça, GET, PROPFIND ... métodos)
Julian Reschke
1
@JulianReschke Você poderia apontar lugares nas especificações que fazem o backup de sua declaração?
Piotr Dobrogost
7
@BobAman Na sua descrição, você está cometendo os mesmos erros cometidos na especificação HTTP original ( RFC 1945 ). Por exemplo, dizendo que os clientes devem seguir o redirecionamento para solicitações POST / PUT / DELETE. após 303 redirecionamento sem especificar que o http verbo para uso no seguinte pedido deve ser GET é enganosa ...
Piotr Dobrogost
2
Corrigindo-me: "Seguir um 303 requer reescrever o método para GET, a menos que o método inicial fosse HEAD".
Julian Reschke
2
Piotr: o padrão deve ser não modificar o método; o recurso movido, que não afeta como manipulá-lo. 303 é uma exceção; isso não significa "o recurso foi movido", mas "a solicitação foi processada e aqui está o seu resultado"; é um tipo totalmente diferente de redirecionamento. Veja greenbytes.de/tech/webdav/…
Julian Reschke
84

A diferença entre 303 e 307 é esta:

303 : Veja outro. A solicitação é recebida corretamente, mas os resultados devem ser recuperados usando um GET no URL de redirecionamento.

307 : Redirecionamento temporário. A solicitação inteira deve ser redirecionada para o novo URL. Quaisquer dados de postagem devem ser postados novamente.

Observe que o 302 foi projetado para ter o comportamento 307, mas a maioria dos navegadores o implementou como o comportamento do 303 (os dois não existiam na época). Portanto, esses dois novos códigos foram introduzidos para substituir o 302.

A diferença entre 301 e 303:

301 : O documento é movido. Solicitações futuras devem usar o novo URL. Este URL está obsoleto.

Nota: Tenha cuidado com este código. Navegadores e proxies tendem a aplicar um cache realmente agressivo, portanto, se você responder com um 301, pode levar um longo tempo para alguém revisar esse URL.

303 : A solicitação foi recebida corretamente. Quaisquer solicitações PUT são processadas. O documento resultante pode ser recuperado a partir do URL de redirecionamento. Solicitações futuras ainda devem ir para o URL original.

GolezTrol
fonte
uma boa publicação no blog que entra nos detalhes do 3xx (e todos os problemas com ele) está em: insanecoding.blogspot.no/2014/02/…
arcuri82
@ skeller88 Você alterou a minha resposta incorreta, então eu a reverti (vaia as pessoas que aceitaram a alteração)! Você introduziu o mesmo erro que a resposta aceita. 303 é um tipo diferente de redirecionamento e regras diferentes, como confirmado pelos comentários por Julian Reschke sobre a resposta aceita eo blog que estava ligado por arcuri82
GolezTrol