L'errore "troppi reindirizzamenti" significa che il sito Web continua a essere reindirizzato tra indirizzi diversi in un modo che non verrà mai completato. Spesso questo è il risultato di reindirizzamenti concorrenti, uno che tenta di forzare HTTPS (SSL) e un altro reindirizza a HTTP (non SSL) o tra forme www e non www dell'URL.
Se stai utilizzando un CMS come Wordpress, Magento, ecc., utilizza un base_url o configurazione del tipo di URL all'interno del sito, puoi finire con la configurazione nel codice o nel database in conflitto con un reindirizzamento in un file .htaccess. Questi reindirizzamenti in conflitto si ribaltano avanti e indietro e non vengono mai completati.
Il tuo browser ti protegge da questo consentendo solo un certo numero di reindirizzamenti (spesso dieci o giù di lì) prima che si arrende e segnali il messaggio di errore "troppi reindirizzamenti". Questo si presenta in modo diverso tra Chrome, Firefox e altri browser.
Firefox
La pagina non viene reindirizzata correttamente. Si è verificato un errore durante una connessione a
Chrome
Questa pagina non funziona
Anche l'utilità di test curl si arrende dopo 50 reindirizzamenti per impostazione predefinita.
Ricciolo: Reindirizzamenti massimi (X) seguiti
curl -svILk https://www.example.com
....
* Maximum (50) redirects followed
Il primo passo:cache e cookie
Come mostrato negli errori del browser sopra, questi reindirizzamenti in loop possono anche essere causati dai cookie nel browser che memorizzano nella cache i vecchi reindirizzamenti. Il primo passo nel test sarebbe svuotare la cache e cancellare i cookie nel browser. Se hai già svuotato cache e cookie nel browser, è il momento di passare a una risoluzione dei problemi più avanzata.
Utilizzo degli strumenti di sviluppo per i loop di reindirizzamento
Il passaggio successivo nella risoluzione dei problemi di questi tipi di loop di reindirizzamento consiste nell'utilizzare gli Strumenti per sviluppatori in Firefox o Chrome. Questi strumenti vengono comunemente aperti premendo il tasto F12. Assicurati di selezionare la Rete scheda in uno di questi e quindi ricarica la pagina con cui stai riscontrando un problema.
Dopo aver ricaricato la pagina, dovresti vedere la serie di reindirizzamenti elencati per te nella nuova finestra. Guardando i reindirizzamenti, puoi vedere se stanno reindirizzando tra alcune cose diverse o reindirizzando alla stessa cosa. In ogni caso, puoi vedere i passaggi che portano all'errore, anziché solo l'errore del browser dell'utente finale.
Strumenti per sviluppatori in Firefox
Utilizzo di cURL per i loop di reindirizzamento
Come parte della stesura di questo articolo, abbiamo messo insieme uno script Bash abbastanza semplice che può essere utilizzato su qualsiasi sistema simile a Unix con il curl comando. L'uso di curl è utile, perché non memorizza nella cache le cose allo stesso modo dei browser, quindi a volte può darti una prospettiva diversa durante la risoluzione dei problemi.
Copia quanto segue nel tuo editor di testo preferito e salvalo come redirects.sh .
#!/bin/bash
echo
for domain in $@; do
echo --------------------
echo $domain
echo --------------------
curl -sILk $domain | egrep 'HTTP|Loc' | sed 's/Loc/ -> Loc/g'
echo
done
Quindi contrassegna il redirect.sh file come eseguibile.
chmod +x redirects.sh
Puoi eseguire il nostro script, come negli esempi seguenti, aggiungendo il tuo dominio dopo il nome dello script. Può anche controllare più domini e controllerà i reindirizzamenti di ciascun URL, a sua volta, inserendo un'intestazione tra domini separati testati.
Esempio di output
./redirects.sh liquidweb.com
--------------------
liquidweb.com
--------------------
HTTP/1.1 301 Moved Permanently
-> Location: https://liquidweb.com/
HTTP/1.1 301 Moved Permanently
-> Location: https://www.liquidweb.com/
HTTP/1.1 200 OK
Esempio di reindirizzamento infinito da HTTP a HTTPS
./redirects.sh http://www.example.com
--------------------
http://www.example.com
--------------------
HTTP/1.1 301 Moved Permanently
-> Location: https://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: http://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: https://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: http://www.example.com/
HTTP/1.1 301 Moved Permanently
....
-> Location: https://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: http://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: https://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: http://www.example.com/
HTTP/1.1 301 Moved Permanently
-> Location: https://www.example.com/
Una nota a margine sui tipi di reindirizzamento
Guardando il ricciolo nell'output sopra puoi vedere che il codice di risposta HTTP è 301. I reindirizzamenti 301 sono reindirizzamenti "permanenti", il che significa che qualcosa si è spostato in modo permanente e tu o il tuo browser dovete cercarlo nella nuova posizione sia ora che in futuro. I reindirizzamenti 302 sono reindirizzamenti "temporanei", il che significa che qualcosa si è spostato per ora, ma potrebbe non trovarsi sempre nella nuova posizione.
I reindirizzamenti 301 vengono spesso scritti come reindirizzamenti o riscrivi voci in un file .htaccess. I reindirizzamenti 302, tuttavia, per design o convenzione sono spesso generati all'interno del codice di un sito web. Quindi una buona regola pratica è che i 301 sono nei file .htaccess e i 302 sono nel codice del sito. Questo potrebbe non essere sempre vero, ma è bene tenerlo a mente.
Reindirizzamenti nel file .htaccess
Il file .htaccess è un file di configurazione utilizzato per modificare il comportamento del server Apache per directory su un sito Web/server. Questo è un file di configurazione a livello di utente e solo alcune configurazioni di Apache possono essere modificate qui, sebbene i reindirizzamenti siano di uso comune.
Puoi avere più file .htaccess che si sovrappongono a una serie di directory. Se hai un .htaccess in una directory principale e un altro in una sottodirectory, entrambi influenzeranno la sottodirectory. In questi casi, è importante ricordare dove hai e dove non hai file .htaccess, per evitare conflitti tra file .htaccess a diversi livelli.
Di seguito sono riportati una serie di esempi di reindirizzamento e aiuteranno a identificare i reindirizzamenti nel tuo file .htaccess. Questi non sono gli unici modi per eseguire questo tipo di reindirizzamenti, ma dovrebbero mostrarti l'aspetto dei reindirizzamenti più comuni in modo da poterli riconoscere se si trovano in un file .htaccess con cui stai lavorando.
Forza HTTPS
Il codice .htaccess di seguito controlla prima se la richiesta è arrivata al server utilizzando HTTP o HTTPS. Se la richiesta non utilizzava HTTPS, la configurazione indicherà al browser di reindirizzare alla versione HTTPS dello stesso sito Web e URL richiesti in precedenza.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Forza HTTPS:quando si è dietro a un sistema di bilanciamento del carico o proxy (CloudFlare/Incapsula/Sucuri/ecc.)
A volte potresti utilizzare un proxy, come un sistema di bilanciamento del carico o un firewall web, come CloudFlare, Incapsula o Sucuri. Questi possono essere configurati per utilizzare SSL sul front-end, ma non utilizzare SSL sul back-end. Per consentire il corretto funzionamento, è necessario verificare non solo HTTPS nella richiesta, ma anche se il proxy ha passato la richiesta HTTPS originale al server utilizzando solo HTTP. Questa regola seguente controlla se la richiesta è stata inoltrata da HTTPS e, in tal caso, non tenta di reindirizzare un'altra volta.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Forza non www
Questo reindirizzamento controlla solo se il nome del sito web è stato richiesto con www all'inizio del nome di dominio. Se il www è incluso, riscrive la richiesta e dice al browser di reindirizzare alla versione non www del nome di dominio.
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Forza www
Quest'ultimo reindirizzamento controlla se il nome del sito non è stato richiesto con www all'inizio del nome a dominio. Se il www non è incluso, riscrive la richiesta e dice al browser di reindirizzare alla versione www del dominio.
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
WordPress
Il CMS WordPress utilizza un file .htaccess per riscrivere gli URL in index.php file, ma definisce l'URL del sito Web come valore nel database. Se non conosci già il nome del database utilizzato sul sito, puoi cercarlo nella configurazione principale di WordPress (wp-config.php ).
Puoi anche aprire il file in un editor di testo e cercare questi valori, ma da una connessione SSH puoi usare il programma grep . Questo ti dà più del semplice nome del database, ma il nome del database è il più importante per quello che dobbiamo fare dopo.
grep DB wp-config.php
define('DB_NAME', 'wordpress_database');
define('DB_USER', 'wordpress_username');
define('DB_PASSWORD', 'Password');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
La tabella wp_options
Una volta che conosci il nome del database, puoi quindi guardare la tabella delle opzioni del database di Wordpress per vedere a cosa è impostato l'URL nel database. La tabella delle opzioni può avere qualsiasi prefisso all'inizio del nome della tabella, ma spesso è "wp_" per impostazione predefinita, quindi il nome completo della tabella delle opzioni è solitamente wp_options . Le due linee importanti sono la casa e URL del sito righe nella tabella delle opzioni. Puoi trovarli usando phpMyAdmin o un'altra utilità di gestione del database, ma dalla riga di comando puoi anche eseguire semplicemente il seguente mysql comando.
mysql -e 'show tables' wordpress_database | grep options
prefix_options
Controllo dell'URL configurato
Dalla riga di comando, puoi controllare quali sono i valori correnti della home e URL del sito righe nella tabella delle opzioni. Il comando dovrebbe inviarti e generare un output come nell'esempio seguente. La parte importante è che questi corrispondano tra loro nella maggior parte delle circostanze e che siano ciò che ti aspetti. Se non sono quello che ti aspetti, vorrai aggiornarli di conseguenza.
mysql -e 'select * from wp_options where option_name rlike "home|siteurl"' wordpress_database
+-----------+-------------+----------------------------------+----------+
| option_id | option_name | option_value | autoload |
+-----------+-------------+----------------------------------+----------+
| 36 | home | http://www.example.com | yes |
| 1 | siteurl | http://www.example.com | yes |
+-----------+-------------+----------------------------------+----------+
Aggiornamento dell'URL configurato
Il comando seguente aggiornerà le due righe di wp_options tabella per un determinato database a un nuovo URL. Questo comando dovrebbe adattarsi alla maggior parte delle situazioni in cui è necessario aggiornare o correggere l'URL configurato per un sito Wordpress. Aggiornamento di base_urls configurato in un multisito Wordpress va oltre lo scopo di questo articolo, ma comporterebbe l'aggiornamento di più wp_option digitare tabelle.
mysql -e 'update wp_options set option_value="https://www.example.com" where option_name rlike "home|siteurl"' wordpress_database
Magento
Il nome del database Magento è configurato in uno dei seguenti file, local.xml o env.php . Puoi anche configurare un prefisso per i nomi delle tabelle del database Magento, ma di solito non è impostato. Quindi il nome previsto per la tabella di configurazione principale del database è solo core_config_data .
# Version 1.x
app/etc/local.xml
# Version 2.x
app/etc/env.php
La tabella core_config_data
Esistono molti potenziali URL che possono essere configurati, ma tutti hanno "base_url " come parte della riga nel database. Gli URL primari configurati saranno gli URL sicuri e non protetti, ma puoi anche impostare URL per immagini, file di temi o persino impostare un URL separato per l'area di amministrazione del sito. Puoi trovarli di nuovo utilizzando un'utilità di gestione del database, ma dalla riga di comando puoi eseguire qualcosa di simile al seguente.
mysql -e 'select * from core_config_data where path rlike "base_url"' magento_database
+-----------+---------+----------+-----------------------+----------------------------+
| config_id | scope | scope_id | path | value |
+-----------+---------+----------+-----------------------+----------------------------+
| 3 | default | 0 | web/unsecure/base_url | http://www.example.com |
| 4 | default | 0 | web/secure/base_url | http://www.example.com |
+-----------+---------+----------+-----------------------+----------------------------+
Per aggiornare gli URL_base nel database Magento, eseguiresti qualcosa di simile al comando seguente. Anche l'aggiornamento dei base_urls di un multisito Magento va oltre lo scopo di questo articolo, ma comporterebbe inoltre il riferimento allo specifico scope_id valore per il determinato sito Web o negozio configurato nel database Magento.
mysql -e 'update core_config_data set value="https://www.example.com" where path rlike "web/.*/base_url"' magento_database
Arrotolare tutto
Con gli URL configurati nel database, come mostrato sopra, vale la pena notare che questi CMS forniscono anche i propri metodi di reindirizzamento all'interno del codice del sito. Se, ad esempio, hai un reindirizzamento .htaccess che reindirizza a un URL che non è allineato con ciò che è nel database, puoi finire con il ciclo di reindirizzamento infinito come descritto in precedenza. Tuttavia, ora sai che aspetto hanno alcuni reindirizzamenti .htaccess comuni e dove trovare gli URL configurati in alcuni database di software CMS. Sei anche ben attrezzato per testare, indagare e confermare se queste cose funzionano di concerto o l'una contro l'altra e alcuni passaggi per risolverle.