Qual è la differenza tra i codici di stato HTTP 301 e 308?


138

Qual è la differenza tra HTTP 301e 308codici di stato?

  • 301 (Spostato in modo permanente): questa e tutte le richieste future devono essere indirizzate all'URI specificato.

  • 308 (Reindirizzamento permanente): la richiesta e tutte le richieste future devono essere ripetute utilizzando un altro URI.

Sembrano essere simili.


Nessun codice 308 in tools.ietf.org/html/rfc2616 e tools.ietf.org/html/rfc6585 , quindi la domanda deve essere rivolta all'ideatore di questo codice non standard.
KonstantinL,

4
C'è la specifica RFC 7538, quindi è un vero codice HTTP
Alexander Drobyshevsky

2
Bene, tools.ietf.org/html/rfc7538 : Nota: questo codice di stato è simile a 301, tranne per il fatto che non consente di modificare il metodo di richiesta da POST a GET.
KonstantinL,

4
Non utilizzare RFC 2616 come riferimento. Era obsoleto dalle RFC 7230-35.
cassiomolin

Risposte:


258

Una panoramica di 301 , 302e307

L' RFC 7231 , l'attuale riferimento per la semantica e il contenuto del protocollo HTTP / 1.1, definisce il codice di stato 301(Spostato permanentemente) e 302(Trovato), che consente di modificare il metodo di richiesta da POSTa GET. Questa specifica definisce anche il307 codice di stato (Reindirizzamento temporaneo) che non consente di modificare il metodo di richiesta da POSTa GET.

Vedere più dettagli di seguito:

6.4.2. 301 Spostato in modo permanente

Il 301codice di stato (Spostato in modo permanente) indica che alla risorsa di destinazione è stato assegnato un nuovo URI permanente e qualsiasi riferimento futuro a questa risorsa dovrebbe utilizzare uno degli URI inclusi. [...]

Nota: per ragioni storiche, un agente utente PU cambiare il metodo di richiesta da POSTa GETper la richiesta successiva. Se questo comportamento non è desiderato, è 307possibile utilizzare il codice di stato (Reindirizzamento temporaneo).

6.4.3. 302 Found

Il 302codice di stato (Trovato) indica che la risorsa di destinazione risiede temporaneamente sotto un URI diverso. Poiché il reindirizzamento potrebbe essere modificato occasionalmente, il client dovrebbe continuare a utilizzare l'URI della richiesta effettiva per le richieste future. [...]

Nota: per ragioni storiche, un agente utente PU cambiare il metodo di richiesta da POSTa GETper la richiesta successiva. Se questo comportamento non è desiderato, è 307possibile utilizzare il codice di stato (Reindirizzamento temporaneo).

6.4.7. 307 Reindirizzamento temporaneo

Il 307 codice di stato (Reindirizzamento temporaneo) indica che la risorsa di destinazione risiede temporaneamente sotto un URI diverso e l'agente utente NON DEVE modificare il metodo di richiesta se esegue un reindirizzamento automatico a quell'URI. Poiché il reindirizzamento può cambiare nel tempo, il client dovrebbe continuare a utilizzare l'URI della richiesta effettiva originale per le richieste future. [...]

Nota: questo codice di stato è simile a 302(Trovato), tranne per il fatto che non consente di modificare il metodo di richiesta da POSTa GET. Questa specifica non definisce alcuna controparte equivalente per 301(Moved Permanently) ( RFC 7238 , tuttavia, definisce il codice di stato 308 (Permanent Redirect) per questo scopo).

Il bisogno di 308

L' RFC 7238 è stato creato per definire il 308codice di stato (Reindirizzamento permanente), che è simile a 301(Spostato in modo permanente) ma non consente di modificare il metodo di richiesta da POSTa GET.

Il 308codice di stato è ora definito dalla RFC 7538 (che rendeva obsoleta la RFC 7238 ).

3. 308 Reindirizzamento permanente

Il 308codice di stato (Reindirizzamento permanente) indica che alla risorsa di destinazione è stato assegnato un nuovo URI permanente e qualsiasi riferimento futuro a questa risorsa dovrebbe utilizzare uno degli URI inclusi. I client con funzionalità di modifica dei collegamenti dovrebbero ricollegare automaticamente i riferimenti all'URI della richiesta effettiva a uno o più dei nuovi riferimenti inviati dal server, ove possibile. [...]

Nota: questo codice di stato è simile a 301(Spostato in modo permanente), tranne per il fatto che non consente di modificare il metodo di richiesta da POSTaGET .

Se abbiamo quanto segue:

                                                             +-----------+-----------+
                                                             | 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       |
+------------------------------------------------------------+-----------+-----------+

Scegliere il codice di stato più adatto

Michael Kropat ha messo insieme una serie di grafici decisionali che aiutano a determinare il miglior codice di stato per ogni situazione. Vedere quanto segue per 2xxe 3xxcodici di stato:

Scegliere un codice di stato 2xx o 3xx


3
Dato che la domanda riguardava specificamente la destinazione tra 301 e 308, potresti dare qualche spiegazione in più su: "non consente di cambiare il metodo di richiesta da POSTa GET" ? Significherebbe che un modulo inviato non può essere elaborato, ma un nuovo modulo nuovo potrebbe essere serverd e quindi essere pubblicato su una richiesta successiva?
R. Schreurs

1
Questa bozza di specifica ( tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html ) suggerisce che i servizi ReSTful dovrebbero usare 308 anche per i GET. "I codici di reindirizzamento HTTP 301-306 NON DOVREBBERO essere utilizzati a meno che il provider di servizi non sia a conoscenza che il client è in realtà un agente utente." Tuttavia questa è solo una bozza. Non sono sicuro se / quando verrà accettato.
Bruce Adams

1
Questo post, la-guida-definitiva-per-ottenere-vs-post , chiarisce perché consentire a una POSTrichiesta (sicura) di essere modificata in a GET(non sicuro in quanto i dati vengono passati aggiungendoli all'URL - e gli URL possono essere salvati - incluse le password) può essere un problema di sicurezza e generalmente dovrebbe essere evitato, a meno che tu non sappia che è sicuro modificarlo. In questi giorni sembra che sia generalmente supportato e preferisca utilizzare 307, 308 su 301, 302. Ma dovresti verificare.
SherylHohman

1
Mnemonic 308è come un infinito laterale, quindi reindirizza permanente e non cambia mai il metodo di richiesta: è anche un tipo di richiesta fisso e permanente. Quindi, 307è il 1passaggio sotto: metodo di richiesta permanente / mantieni (Get / Post), ma reindirizza a una posizione temporanea: 7 - sembra "svolta a sinistra" o deviazione temporanea, e 7 è anche simile a k, quindi "mantieni" il metodo di richiesta.
SherylHohman

Hai dimenticato di menzionare Riprendi incompleto .
Knu
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.