Vai al contenuto principale

Guide / I codici di stato HTTP spiegati

300 Multiple Choices: il codice che non vedrai quasi mai

300 Multiple Choices significa che la risorsa richiesta ha più di una rappresentazione e il server sta chiedendo al client di sceglierne una invece di sceglierla lui stesso. È definito dallo standard HTTP ma quasi mai usato, quindi se lo stai cercando probabilmente hai incontrato un 301 o un 302 invece di un vero 300.

Per cosa è stato progettato il codice

HTTP supporta la negoziazione del contenuto: lo stesso URL può avere diverse rappresentazioni che differiscono per formato, lingua o codifica. Normalmente il server decide, usando le intestazioni Accept, Accept-Language e Accept-Encoding del client, e restituisce quella scelta con un 200. Questa è la negoziazione guidata dal server, ed è ciò che fa il web.

300 Multiple Choices copre l'altro approccio, la negoziazione guidata dall'agente. Invece di scegliere, il server risponde con un elenco delle rappresentazioni disponibili e lascia scegliere il client o l'utente. La risposta può includere un'intestazione Location che nomina l'opzione preferita dal server, che un client è libero di seguire.

Perché quasi non lo vedi mai

Lo standard non ha mai specificato un formato leggibile da macchina per l'elenco delle scelte. Senza un formato concordato non c'è nulla che un browser possa analizzare, quindi nessun browser diffuso implementa un'interfaccia di selezione per un 300. I browser di solito mostrano il corpo della risposta come una pagina ordinaria invece, oppure seguono l'intestazione Location se presente, il che fa comportare il 300 come un debole reindirizzamento. I framework applicativi e le CDN non lo emettono nelle loro configurazioni predefinite, e la negoziazione guidata dal server risolve lo stesso problema in modo invisibile e migliore, quindi nessuno ha motivo di passare all'altro approccio.

Un 300 compare comunque in alcuni posti:

  • Il mod_negotiation di Apache con MultiViews abilitato, quando diversi file corrispondono a una richiesta come /logo e il modulo non può classificarli. Genera un elenco HTML di candidati.
  • API scritte a mano che restituiscono deliberatamente un elenco JSON di URL di risorse alternative, usando 300 come indizio semantico invece di aspettarsi che qualche client lo gestisca nativamente.
  • Suite di test e strumenti di conformità al protocollo che esercitano ogni codice di stato definito.

Perché le persone cercano il codice di stato 300

La maggior parte delle ricerche per "codice di stato 300" non riguarda affatto un 300. Il numero è l'inizio della famiglia dei reindirizzamenti, quindi le persone che hanno visto un reindirizzamento in uno strumento del browser, un log o un crawler SEO e si sono ricordate "un 3-qualcosa" cercano prima 300. Quello che di solito hanno è:

  • Un 301, un reindirizzamento permanente, segnalato da un crawler SEO come parte di una catena.
  • Un 302, un reindirizzamento temporaneo, quello predefinito che emettono molti framework.
  • Un 304, che è una risposta di validazione della cache invece che un reindirizzamento del tutto.
  • Un riepilogo di un crawler che raggruppa tutto sotto un'intestazione "3xx", che viene poi letta come "300".

Se stai cercando di capire quale reindirizzamento restituisce un URL, la guida 301 vs 302 è quella che ti serve.

Come verificare se hai davvero un 300

  1. Chiedi le intestazioni senza seguire alcun reindirizzamento e leggi il numero esatto:
    curl -sI https://example.com/some-path | grep -Ei "^(HTTP|location|link|alternates)"
    Un vero 300 mostra HTTP/1.1 300 Multiple Choices. Qualsiasi altra cosa è un codice diverso e una guida diversa.
  2. Se è davvero un 300 e non lo intendevi, guarda prima Apache. Disabilitare MultiViews per quella directory, oppure dare al file un'estensione esplicita nell'URL, rimuove l'ambiguità che fa scattare la negoziazione.
  3. Se vuoi che sia il server a scegliere, mantieni la negoziazione guidata dal server: restituisci 200 con la rappresentazione selezionata e un'intestazione Vary che nomina le intestazioni di richiesta su cui hai negoziato, così le cache memorizzano le varianti separatamente.
  4. Se vuoi mandare i client altrove, usa un vero reindirizzamento. Gli spostamenti permanenti ottengono 301 o 308, quelli temporanei ottengono 302 o 307. Non usare 300 come reindirizzamento, perché i client non sono obbligati a seguirlo.
  5. Risolvi l'ambiguità alla fonte. Un 300 quasi sempre significa che due file o due rotte stanno competendo per lo stesso URL, e la soluzione duratura è rendere l'URL non ambiguo.

Individuare un 300 inatteso dopo un deployment

Un 300 inatteso tende ad arrivare con un aggiornamento del server o una modifica di configurazione, e nessuno se ne accorge: la pagina può ancora sembrare più o meno giusta in un browser mentre i crawler e i client API ottengono una risposta che non possono usare. Un controllo esterno che registra il codice di stato esatto per ogni URL fa emergere il cambiamento alla prima esecuzione dopo il deployment. HostTracker monitora siti web dal 2004 ed esegue controlli da oltre 300 postazioni in 158 città. Verifica cosa restituisce un URL in questo momento con lo strumento di controllo HTTP, oppure leggi la guida completa alla famiglia di reindirizzamento 3xx.

Controlla ora

Esegui il controllo gratuito sul tuo sito, senza bisogno di un account.

HTTP check

Monitora in modo permanente

Ricevi un avviso appena qualcosa si rompe: HostTracker controlla da oltre 300 località e ti avvisa via e-mail, SMS, Slack, Telegram e altro.

Funzionalità di HostTracker

Altro in questa sezione: I codici di stato HTTP spiegati