Differenza tra i codici di reindirizzamento HTTP

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 attuale.

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

Inoltre, il codice di reindirizzamento 307 sembra chiaro: significa che il reindirizzamento è temporaneo e che le richieste future dovrebbero ancora utilizzare l’URI originale.

Ma non posso dire quale sia la differenza tra 302 e 303 , o perché entrambi sono davvero diversi da 301 . Sembra che 302 originariamente fosse destinato a essere un reindirizzamento temporaneo , (come 307 ), ma in pratica, la maggior parte dei browser lo trattava come un 303 . Ma qual è la differenza tra un 303 e un 301 ? 301 dovrebbe significare che il reindirizzamento è più permanente?

  • 301 : reindirizzamento permanente. I client che effettuano richieste successive per questa risorsa devono utilizzare il nuovo URI. I client non dovrebbero seguire automaticamente il reindirizzamento per le richieste POST / PUT / DELETE.
  • 302 : reindirizzamento per motivo indefinito. I client che effettuano richieste successive per questa risorsa non devono utilizzare il nuovo URI. I client non dovrebbero seguire automaticamente il reindirizzamento per le richieste POST / PUT / DELETE.
  • 303 : reindirizzamento per motivo indefinito. In genere, “l’operazione è stata completata, continua altrove”. I client che effettuano richieste successive per questa risorsa non devono utilizzare il nuovo URI. I client 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 client che effettuano richieste successive per questa risorsa devono utilizzare il vecchio URI. I client non dovrebbero seguire automaticamente il reindirizzamento per le richieste POST / PUT / DELETE.

Personalmente raccomando di evitare 302 se avete la scelta. Molti client non seguono le specifiche quando incontrano un 302. Per i reindirizzamenti temporanei, è necessario utilizzare 303 o 307, a seconda del tipo di comportamento che si desidera sulle richieste non GET. Preferisci da 307 a 303 a meno che non sia necessario il comportamento alternativo su POST / PUT / DELETE.

La differenza tra 303 e 307 è questa:

303 : Vedi altro. 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. Eventuali post dati devono essere postati nuovamente.

Si noti che 302 era destinato ad avere il comportamento di 307, ma la maggior parte dei browser l’ha implementato come comportamento di 303 (entrambi 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 usare il nuovo URL. Questo URL è obsoleto.

Nota: fai attenzione con questo codice. I browser e i proxy tendono ad applicare una cache molto aggressiva su di esso, quindi se rispondi con un 301 potrebbe volerci molto tempo prima che qualcuno possa rivedere quell’URL.

303 : la richiesta è stata ricevuta correttamente. Qualsiasi richiesta PUT viene elaborata. Il documento risultante può essere recuperato dall’URL di reindirizzamento. La richiesta futura dovrebbe ancora andare all’URL originale.