Differenza tra i codici di reindirizzamento HTTP


151

Le differenze tra i vari codici di reindirizzamento HTTP 3XX non mi sono chiare. Sì, ho letto le specifiche, ma sembra esserci qualche discrepanza tra la pratica standard e quella reale qui.

Il 301codice di reindirizzamento sembra abbastanza chiaro: ciò significa che la risorsa è stata spostata in modo permanente in un altro URI e le richieste future dovrebbero utilizzare tale URI.

E anche il 307codice di reindirizzamento sembra chiaro: significa che il reindirizzamento è temporaneo e le richieste future dovrebbero comunque utilizzare l'URI originale.

Ma non posso dire quale sia la differenza tra 302e 303, o perché una delle due sia davvero diversa 301. Sembra che 302originariamente doveva essere un reindirizzamento temporaneo , (come 307), ma in pratica, la maggior parte dei browser lo trattava come un 303. Ma qual è la differenza tra a 303e a 301? È 301dovrebbe significare il redirect è più permanente?

Risposte:


139
  • 301 : reindirizzamento permanente. I clienti che fanno richieste successive per questa risorsa dovrebbero usare il nuovo URI. I client non devono seguire automaticamente il reindirizzamento per le richieste POST / PUT / DELETE.
  • 302 : reindirizzamento per motivo indefinito. I client che fanno richieste successive per questa risorsa non devono usare il nuovo URI. I client non devono seguire automaticamente il reindirizzamento per le richieste POST / PUT / DELETE.
  • 303 : reindirizzamento per motivo indefinito. In genere, "Operazione completata, continua altrove". I client che fanno richieste successive per questa risorsa non devono usare il nuovo URI. I clienti devono seguire il reindirizzamento per le richieste POST / PUT / DELETE, ma utilizzare GET per la richiesta di follow-up .
  • 307 : reindirizzamento temporaneo. La risorsa può tornare a questa posizione in un secondo momento. I clienti che fanno richieste successive per questa risorsa dovrebbero usare il vecchio URI. I client non devono seguire automaticamente il reindirizzamento per le richieste POST / PUT / DELETE.

Consiglio personalmente di evitare 302 se hai la scelta. Molti client non seguono le specifiche quando incontrano un 302. Per reindirizzamenti temporanei, è necessario utilizzare 303 o 307, a seconda del tipo di comportamento desiderato nelle richieste non GET. Preferisci da 307 a 303 a meno che tu non abbia bisogno del comportamento alternativo su POST / PUT / DELETE.


26
No. A seguito di un 303 è necessario riscrivere il metodo su GET. Seguire gli altri richiede di mantenere il metodo, ma per confermare con l'UA se il metodo non è sicuro (quindi metodi diversi da OPTIONS, HEAD, GET, PROPFIND ...)
Julian Reschke,

1
@JulianReschke Potresti indicare punti nelle specifiche a sostegno della tua dichiarazione?
Piotr Dobrogost,

7
@BobAman Nella tua descrizione stai facendo gli stessi errori fatti nelle specifiche HTTP originali ( RFC 1945 ). Ad esempio, dicendo che i clienti dovrebbero seguire il reindirizzamento per le richieste POST / PUT / DELETE. dopo 303 reindirizzamento senza specificare che il verbo http da utilizzare nella seguente richiesta deve essere GET è fuorviante ...
Piotr Dobrogost,

2
Correggendo me stesso: "Seguire un 303 richiede di riscrivere il metodo su GET a meno che il metodo iniziale fosse HEAD".
Julian Reschke,

2
Piotr: il default dovrebbe essere di non modificare il metodo; la risorsa è stata spostata, ciò non influisce su come manipolarla. 303 è un'eccezione; non significa "la risorsa è stata spostata" ma "la richiesta è stata elaborata, ed ecco il tuo risultato"; è un tipo di reindirizzamento completamente diverso. Vedi greenbytes.de/tech/webdav/…
Julian Reschke il

84

La differenza tra 303 e 307 è questa:

303 : vedi altri. La richiesta viene ricevuta correttamente, ma i risultati devono essere recuperati utilizzando un GET sull'URL di reindirizzamento.

307 : reindirizzamento temporaneo. L'intera richiesta deve essere reindirizzata al nuovo URL. Tutti i dati di post devono essere ripubblicati.

Si noti che 302 doveva avere il comportamento di 307, ma la maggior parte dei browser lo implementava come comportamento di 303 (entrambi i quali non esistevano allora). Pertanto, questi due nuovi codici sono stati introdotti per sostituire 302.

La differenza tra 301 e 303:

301 : il documento viene spostato. Le richieste future dovrebbero utilizzare il nuovo URL. Questo URL è obsoleto.

Nota: fare attenzione con questo codice. Browser e proxy tendono ad applicare una cache davvero aggressiva su di esso, quindi se rispondi con un 301 potrebbe volerci molto tempo prima che qualcuno riveda quell'URL.

303 : la richiesta è stata ricevuta correttamente. Tutte le richieste PUT vengono elaborate. Il documento risultante può essere recuperato dall'URL di reindirizzamento. Le richieste future dovrebbero comunque andare all'URL originale.


un buon post sul blog che entra nei dettagli di 3xx (e tutti i problemi con esso) è a: insanecoding.blogspot.no/2014/02/…
arcuri82

@ skeller88 La modifica ha reso la mia risposta errata, quindi l'ho ripristinata (fischio alle persone che hanno accettato la modifica)! Hai introdotto lo stesso errore della risposta accettata. 303 è un diverso tipo di reindirizzamento e si applicano regole diverse, come confermato dai commenti di Julian Reschke sulla risposta accettata e sul blog che è stato collegato da arcuri82
GolezTrol il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.