Exemplos de 302 vs 303

22

Qual é a diferença entre a 302e 303response?

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

  • 10.3.3 302 Encontrados
  • 10.3.4 303 Ver outros

São intercambiáveis ​​ou por que um seria usado sobre o outro? Você poderia fornecer um caso de uso de quando um seria usado (e o outro não)?

David542
fonte

Respostas:

35

A descrição na página à qual você vinculou parece ser bastante descritiva da finalidade pretendida:

Um redirecionamento 302 indica que o redirecionamento é temporário - os clientes devem verificar novamente o URL original em solicitações futuras.

Um redirecionamento 303 destina-se a redirecionar uma POSTsolicitação para um GETrecurso (caso contrário, o cliente assume que o método de solicitação para o novo local é o mesmo que para o recurso original).

Se você estiver redirecionando um cliente como parte de seu aplicativo Web, mas espera que ele sempre inicie no aplicativo Web (por exemplo, um encurtador de URL), um redirecionamento 302 parece fazer sentido. Um redirecionamento 303 é para ser usado quando você recebe POSTdados de um cliente (por exemplo, um envio de formulário) e deseja redirecioná-los para uma nova página da Web a ser recuperada usando em GETvez de POST(por exemplo, uma solicitação de página padrão).

Mas veja esta nota nas definições do código de status - a maioria dos clientes fará a mesma coisa para um 302 ou 303:

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it were a 303
  response, performing a GET on the Location field-value regardless
  of the original request method. The status codes 303 and 307 have
  been added for servers that wish to make unambiguously clear which
  kind of reaction is expected of the client.
larsks
fonte
4
Claro, mas errado. Um redirecionamento 303 não é permanente. O RFC indica "A resposta 303 NÃO DEVE ser armazenada em cache" . A descrição que você forneceu aqui corresponde a um redirecionamento 301.
Ladadadada
2
Mea culpa. Eu tinha 301 e 303 para trás. Eu atualizei a resposta.
Larsks 22/05
há 308 agora
Miranda
Eu acho que é um pouco enganador sugerir que o 303 é "destinado" a redirecionar um POST para um GET - ponto final. A especificação sugere que 303 é mais sobre a disponibilidade de uma representação de um recurso por meio do método originalmente solicitado. Se, por exemplo, eu tiver uma imagem grande protegida por direitos disponível apenas para usuários autenticados, posso usar um 303 para redirecionar usuários não autenticados para uma imagem menor. O método de solicitação usado nesse caso é irrelevante.
beaudet
O RFC diz "Este método existe principalmente para permitir que a saída de um script ativado pelo POST redirecione o agente do usuário para um recurso selecionado". e "A resposta à solicitação pode ser encontrada em um URI diferente e deve ser recuperada usando um método GET nesse recurso". Eu acho que coincide com o que eu disse (todos esses anos atrás), mas tenho certeza de que há espaço para interpretação.
larsks
15

Existem quatro tipos diferentes de redirecionamento (atualmente). Originalmente, havia apenas dois, mas a maioria dos clientes implementava o redirecionamento 302 incorretamente; portanto, mais dois foram adicionados para esclarecer a diferença entre os dois comportamentos possíveis diferentes ao receber um 302.

O RFC ao qual você vinculou afirma isso na seção 302 redireciona:

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it were a 303
  response, performing a GET on the Location field-value regardless
  of the original request method. The status codes 303 and 307 have
  been added for servers that wish to make unambiguously clear which
  kind of reaction is expected of the client.
  1. Um redirecionamento 301 é um redirecionamento permanente. É armazenável em cache e qualquer marcador para este URL deve ser atualizado para apontar para o novo URL.
  2. Um redirecionamento 302 é um redirecionamento temporário. Ele não pode ser armazenado em cache por padrão e deve ser solicitado novamente sempre (mas você pode substituí-lo por cabeçalhos de armazenamento em cache). A solicitação de acompanhamento deve usar o mesmo método (POST, GET, CONNECT, PUT, DELETE etc.) da solicitação original e, para outras solicitações que não sejam GET e HEAD, o cliente deve solicitar ao usuário antes de fazer a solicitação. Essa é a parte em que os clientes se enganaram e a maioria deles altera o método da solicitação de acompanhamento para GET, independentemente do método original.
  3. Um redirecionamento 303 é igual a um 302, exceto que a solicitação de acompanhamento agora é explicitamente alterada para uma solicitação GET e nenhuma confirmação é necessária.
  4. Um redirecionamento 307 é igual a um 302, exceto que a solicitação de acompanhamento agora é explicitamente a mesma que a solicitação original e a confirmação deve ser adquirida do usuário para métodos de solicitação diferentes de GET e HEAD.

Clientes mais antigos podem não entender o redirecionamento 303. Qualquer coisa que faça uma solicitação HTTP / 1.1 deve entender uma resposta 303.

É possível considerar 300 e 305 respostas como redirecionamentos, o que significa que existem seis tipos diferentes.

Ladadadada
fonte
0

Os tipos de redirecionamento (301.302.303 ...) usados ​​têm muito impacto sobre como os mecanismos de pesquisa indexarão e classificarão o conteúdo. Algumas aranhas podem até se recusar a indexar conteúdo redirecionado temporariamente. Detalhes podem ser encontrados em várias publicações sobre SEO ...

rackandboneman
fonte