Redirect HTTP
Il reindirizzamento URL, noto anche come inoltro URL, è una tecnica per assegnare più di un indirizzo URL a una pagina, un modulo, un intero sito Web o un’applicazione Web. HTTP ha un tipo speciale di risposta, chiamato reindirizzamento HTTP, per questa operazione.
I reindirizzamenti raggiungono numerosi obiettivi:
- Reindirizzamenti temporanei durante la manutenzione o i tempi di inattività del sito
- Reindirizzamenti permanenti per preservare i link/segnalibri esistenti dopo aver modificato gli URL del sito, le pagine di avanzamento durante il caricamento di un file, ecc.
Principio
In HTTP, il reindirizzamento viene attivato da un server che invia una risposta di reindirizzamento speciale a una richiesta. Le risposte di reindirizzamento hanno codici di stato che iniziano con 3 e un’intestazione Location che contiene l’URL a cui reindirizzare.
Quando i browser ricevono un reindirizzamento, caricano immediatamente il nuovo URL fornito nell’intestazione Location. Oltre al piccolo calo di prestazioni di un round-trip aggiuntivo, gli utenti raramente notano il reindirizzamento.
Esistono diversi tipi di reindirizzamenti, ordinati in tre categorie:
- Reindirizzamenti permanenti
- Reindirizzamenti temporanei
- Reindirizzamenti speciali
Reindirizzamenti permanenti
Questi reindirizzamenti sono pensati per durare per sempre. Implicano che l’URL originale non debba più essere utilizzato e sostituito con quello nuovo. I robot dei motori di ricerca, i lettori RSS e altri crawler aggiorneranno l’URL originale per la risorsa.
1] La specifica non intendeva consentire modifiche al metodo, ma ci sono agenti utente esistenti che cambiano il loro metodo. 308 è stato creato per rimuovere l’ambiguità del comportamento quando si utilizzano metodi non GET.
Reindirizzamenti temporanei
A volte la risorsa richiesta non è accessibile dalla sua posizione canonica, ma è possibile accedervi da un altro posto. In questo caso, è possibile utilizzare un reindirizzamento temporaneo.
I robot dei motori di ricerca e altri crawler non memorizzano il nuovo URL temporaneo. I reindirizzamenti temporanei vengono utilizzati anche durante la creazione, l’aggiornamento o l’eliminazione di risorse, per mostrare pagine di avanzamento temporanee.
Codice |
Testo |
Metodo di gestione |
Uso tipico |
301 |
Moved Permanently |
GET metodi non cambiati Altri potrebbero o non potrebbero essere modificati in GET. [1] |
Riorganizzazione di un sito web. |
308 |
Permanent Redirect |
Method and body non cambiati |
Riorganizzazione di un sito web, con collegamenti/operazioni non-GET. |
[2] La specifica non intendeva consentire modifiche al metodo, ma ci sono agenti utente esistenti che cambiano il loro metodo. 307 è stato creato per rimuovere l’ambiguità del comportamento quando si utilizzano metodi non-GET.
Codice | Testo | Metodo di gestione | Uso tipico |
---|---|---|---|
302 | Found | Metodi GET invariati. Altri possono o non possono essere modificati in GET. [2] | La pagina Web è temporaneamente non disponibile per motivi imprevisti. |
303 | See Other | Metodi GET invariati. Altri sono cambiati in GET (body perso). | Utilizzato per reindirizzare dopo un PUT o un POST, in modo che l’aggiornamento della pagina dei risultati non riattivi l’operazione. |
307 | Temporary Redirect | Metodo e body non cambiati | La pagina Web è temporaneamente non disponibile per motivi imprevisti. Meglio di 302 quando sono disponibili operazioni non GET sul sito.. |
Reindirizzamenti speciali
304 (Not Modified) reindirizza una pagina alla copia memorizzata nella cache locale (che era obsoleta) e 300 (Multiple Choices) è un reindirizzamento manuale: il corpo, presentato dal browser come una pagina Web, elenca i possibili reindirizzamenti e l’utente fa clic su uno per selezionarlo.
Codice | Testo | Metodo di gestione | Uso tipico |
---|---|---|---|
300 | Multiple Choices | Non molte: le scelte sono elencate in una pagina HTML nel corpo. Si consiglia di inviare scelte leggibili dalla macchina come intestazioni Link con rel=alternate.
|
La pagina Web è temporaneamente non disponibile per motivi imprevisti.
|
304 | Not Modified | Inviato per richieste condizionali convalidate. Indica che la risposta memorizzata nella cache è ancora fresca e può essere utilizzata. | Utilizzato per reindirizzare dopo un PUT o un POST, in modo che l’aggiornamento della pagina dei risultati non riattivi l’operazione. |
Modo alternativo per specificare i reindirizzamenti
I reindirizzamenti HTTP non sono l’unico modo per definire i reindirizzamenti. Ce ne sono altri due:
- Reindirizzamenti HTML con l’elemento <meta>
- Reindirizzamenti JavaScript tramite il DOM
Reindirizzamenti HTML
I reindirizzamenti HTTP sono il modo migliore per creare reindirizzamenti, ma a volte non si ha il controllo sul server. In tal caso, prova un elemento <meta> con il suo attributo http-equiv impostato su Refresh nel <head> della pagina. Quando visualizzi la pagina, il browser andrà all’URL indicato.
HTML <head> <meta http-equiv="Refresh" content="0; URL=https://example.com/" /> </head>
L’attributo content dovrebbe iniziare con un numero che indica quanti secondi il browser deve attendere prima di reindirizzare all’URL specificato. Impostalo sempre su 0 per conformità all’accessibilità.
Ovviamente, questo metodo funziona solo con HTML e non può essere utilizzato per immagini o altri tipi di contenuto.
Reindirizzamenti JavaScript
I reindirizzamenti in JavaScript vengono eseguiti impostando una stringa URL sulla proprietà window.location, caricando la nuova pagina:
JS window.location = "https://esempio.com/";
Come i reindirizzamenti HTML, questo non può funzionare su tutte le risorse e, ovviamente, funzionerà solo sui client che eseguono JavaScript. D’altro canto, ci sono più possibilità: ad esempio, puoi attivare il reindirizzamento solo se vengono soddisfatte alcune condizioni.
Ordine di precedenza
Con tre modi per attivare i reindirizzamenti, è possibile utilizzare più metodi contemporaneamente. Ma quale viene applicato per primo?
- I reindirizzamenti HTTP vengono sempre eseguiti per primi, esistono anche quando non c’è una pagina trasmessa.
- Sorprendentemente, i reindirizzamenti JavaScript vengono eseguiti per primi, prima dei reindirizzamenti HTML. Questo perché il reindirizzamento <meta> avviene dopo che la pagina è stata caricata completamente, ovvero dopo che tutti gli script sono stati eseguiti.
- I reindirizzamenti HTML (<meta>) vengono eseguiti se non ci sono stati reindirizzamenti HTTP o reindirizzamenti JavaScript eseguiti prima del caricamento della pagina.
- Se c’è un reindirizzamento JavaScript che avviene dopo il caricamento della pagina (ad esempio, quando si fa clic su un pulsante), verrà eseguito per ultimo se la pagina non è già stata reindirizzata dai metodi precedenti.
Quando possibile, usa i reindirizzamenti HTTP e non aggiungere reindirizzamenti di elementi <meta>. Se qualcuno modifica i reindirizzamenti HTTP ma dimentica di modificare i reindirizzamenti HTML, i reindirizzamenti non saranno più identici, il che potrebbe causare un loop infinito o altri incubi.
Casi d’uso
Esistono numerosi casi d’uso per i reindirizzamenti, ma poiché le prestazioni sono influenzate da ogni reindirizzamento, il loro utilizzo dovrebbe essere ridotto al minimo.
Alias di dominio
Idealmente, c’è una posizione e quindi un URL per ogni risorsa. Ma ci sono ragioni per nomi alternativi per una risorsa:
Espansione della portata del tuo sito
Un caso comune è quando un sito risiede su www.example.com, ma l’accesso da example.com dovrebbe funzionare anche. I reindirizzamenti per example.com a www.example.com sono quindi impostati. Potresti anche reindirizzare da sinonimi comuni o frequenti errori di battitura dei tuoi domini.
Passaggio a un nuovo dominio
Ad esempio, la tua azienda è stata rinominata, ma vuoi che i link o i segnalibri esistenti ti trovino ancora con il nuovo nome.
Forzare HTTPS
Le richieste alla versione http:// del tuo sito verranno reindirizzate alla versione https:// del tuo sito.
Mantenere attivi i link
Quando ristrutturi i siti web, gli URL cambiano. Anche se aggiorni i link del tuo sito per adattarli ai nuovi URL, non hai alcun controllo sugli URL utilizzati dalle risorse esterne.
Non vuoi interrompere questi link, poiché portano utenti preziosi e aiutano la tua SEO, quindi imposti i reindirizzamenti dai vecchi URL a quelli nuovi.
Nota: questa tecnica funziona per i link interni, ma cerca di evitare di avere reindirizzamenti interni. Un reindirizzamento ha un costo significativo in termini di prestazioni (poiché si verifica una richiesta HTTP extra). Se puoi evitarlo correggendo i link interni, dovresti invece correggere quei link.
Risposte temporanee a richieste non sicure
Le richieste non sicure modificano lo stato del server e l’utente non dovrebbe reinviarle involontariamente.
In genere, non vuoi che i tuoi utenti reinviino richieste PUT, POST o DELETE. Se si serve la risposta come risultato di questa richiesta, una semplice pressione del pulsante di ricarica invierà nuovamente la richiesta (probabilmente dopo un messaggio di conferma).
In questo caso, il server può inviare una risposta 303 (Vedi altro) per un URL che conterrà le informazioni corrette. Se si preme il pulsante di ricarica, viene visualizzata di nuovo solo quella pagina, senza riprodurre le richieste non sicure.
Risposte temporanee a richieste lunghe
Alcune richieste potrebbero richiedere più tempo sul server, come DELETE richieste che sono programmate per un’elaborazione successiva. In questo caso, la risposta è un redirect 303 (Vedi altro) che rimanda a una pagina che indica che l’azione è stata programmata e, alla fine, informa sul suo avanzamento o consente di annullarla.
Configurazione dei reindirizzamenti nei server comuni
Apache
I reindirizzamenti possono essere impostati nel file di configurazione del server o nel file .htaccess di ogni directory.
Il modulo mod_alias ha le direttive Redirect e RedirectMatch che impostano i reindirizzamenti 302 per impostazione predefinita:
Apacheconf <VirtualHost *:443> ServerName example.com Redirect / https://www.example.com </VirtualHost>
L’URL https://esempio.com/ verrà reindirizzato a https://www.esempio.com/, così come tutti i file o le directory al di sotto (https://esempio.com/una-pagina verrà reindirizzato a https://www.esempio.com/una-pagina)
RedirectMatch fa lo stesso, ma accetta un’espressione regolare per definire una raccolta di URL interessati:
Apacheconf RedirectMatch ^/images/(.*)$ https://immagini.esempio.com/$1
Tutti i documenti nella directory images/ verranno reindirizzati a un dominio diverso.
Se non vuoi un reindirizzamento temporaneo, puoi usare un parametro extra (il codice di stato HTTP da usare o la parola chiave permanente) per impostare un reindirizzamento diverso:
Apacheconf Redirect permanent / https://www.esempio.com # …funziona come: Redirect 301 / https://www.esempio.com
Anche il modulo mod_rewrite può creare reindirizzamenti. È più flessibile, ma un po’ più complesso.
Nginx
In Nginx, crei un blocco server specifico per il contenuto che vuoi reindirizzare:
Nginx server { listen 80; server_name esempio.com; return 301 $scheme://www.esempio.com$request_uri; }
Per applicare un reindirizzamento a una directory o solo a determinate pagine, usa la direttiva di riscrittura:
Nginx rewrite ^/images/(.*)$ https://immagini.esempio.com/$1 redirect; rewrite ^/images/(.*)$ https://immagini.esempio.com/$1 permanent;
IIS
In IIS, usi l’elemento <httpRedirect> per configurare i reindirizzamenti.
Cicli di reindirizzamento
I cicli di reindirizzamento si verificano quando ulteriori reindirizzamenti seguono quello già seguito. In altre parole, c’è un ciclo che non verrà mai terminato e non verrà mai trovata alcuna pagina.
Il più delle volte questo è un problema del server e se il server riesce a rilevarlo, invierà un errore interno del server 500. Se riscontri un errore del genere subito dopo aver modificato una configurazione del server, è probabile che si tratti di un ciclo di reindirizzamento.
A volte, il server non lo rileva: un loop di reindirizzamento può estendersi su più server, ognuno dei quali non ha il quadro completo. In questo caso, i browser lo rilevano e visualizzano un messaggio di errore. Firefox visualizza:
Firefox ha rilevato che il server sta reindirizzando la richiesta per questo indirizzo in un modo che non terminerà mai.
…mentre Chrome visualizza:
Questa pagina Web ha un loop di reindirizzamento
In entrambi i casi, l’utente non può fare molto (a meno che non si verifichi un danneggiamento da parte sua, come una mancata corrispondenza di cache o cookie).
È importante evitare i loop di reindirizzamento, poiché interrompono completamente l’esperienza utente.