Indice dell’articolo
In questo blog mi è capitato più volte di parlare di casi in cui diventa necessario modificare l’url di una pagina o addirittura l’intera struttura url di un sito.
Questo può avvenire per esempio quando si fa il cambio del dominio, quando si devono correggere url rotti o in situazioni in cui si vuole ottimizzare la struttura url per evitare problemi di duplicazione di contenuti.
In tutti questi casi è buona norma lato SEO utilizzare un redirect di tipo 30X (i più comuni sono il 301 ed il 302), per trasferire il “valore” (PageRank) di una pagina ad un’altra.
Anche se entrambe le tipologie di redirect sono SEO Friendly la differenza tra l’una e l’altra sta nell’indicazione chi si trasferisce al Motore di Ricerca.
Il Redirect 301 indica “Moved Permanently” cioé trasferito in modo permanente, mentre il Redirect 302 indica “Moved Temporarily” cioè trasferito temporaneamente, quindi il consiglio di base è: se la risorsa che stai reindirizzando non è destinata a tornare in uno stato 200, utilizza il 301, altrimenti utilizza il 302.
Tipologie di Redirect 301
Esistono diversi tipi di redirect come esistono diversi modi per fare un redirect, quello che vedremo oggi è uno dei casi più comuni con cui ci si trova a lavorare ovvero una Redirezione via mod_rewrite nel file htaccess su Apache.
Prima di spiegare la procedura faccio solo un accenno alle altre casistiche di redirezione in cui ci si può imbattere:
- IIS: tramite configurazione del web server;
- Cold fusion
<.cfheader statuscode=”301″ statustext=”Moved permanently”>
<.cfheader name=”Location” value=”http://www.new-url.com”> - PHP
<?
Header( “HTTP/1.1 301 Moved Permanently” );
Header( “Location: http://www.new-url.com” );
?> - ASP
<%@ Language=VBScript %>
<%
Response.Status=”301 Moved Permanently”
Response.AddHeader “Location”,”http://www.new-url.com/”
%> - Asp net
<script runat=”server”>
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = “301 Moved Permanently”;
Response.AddHeader(“Location”,”http://www.new-url.com”);
}
</script> - Java
<%
response.setStatus(301);
response.setHeader( “Location”, “http://www.new-url.com/” );
response.setHeader( “Connection”, “close” );
%> - Perl
$q = new CGI;
print $q->redirect(“http://www.new-url.com/”); - Ruby
def old_action
headers[“Status”] = “301 Moved Permanently”
redirect_to “http://www.new-url.com/”
end
Redirect via mod_rewrite nel file htaccess su Apache
Andiamo ora a vedere nel dettaglio come si effettua un redirect tramite file .htaccess.
Innanzitutto i Redirect tramite file .htaccess possono essere implementati su siti che utilizzano server Apache.
Uno dei moduli più famosi di Apache che si utilizza per le redirezioni è il mod_rewrite attraverso il quale è possibile associare un URL virtuale (non residente sul filesystem) ad un URL reale, tramite delle regole definite nei file .htaccess.
La maggior parte delle installazioni di Apache ha il mod_rewrite installato di default altrimenti è possibile installarlo in autonomia o chiedendo al gestore del server.
Per utilizzare il mod_rewrite , il rewrite engine deve essere attivato con la direttiva:.
RewriteEngine On
A questa direttiva segue la RewriteRule (cioè la Regola di Rewrite) in cui sono definite le indicazioni per l’URL Rewriting attraverso le espressioni regolari (o Regex).
Le regole di rewrite sono formate essenzialmente da 3 argomenti separati da spazi;
- Pattern (Pattern) : quali URL dovrebbero essere influenzati dalla regola;
- Sostituzione (Substitution) : dove devono essere inviate le richieste di abbinamento (redirezione);
- [contrassegni] (flags) : opzioni che riguardano la richiesta di redirezione.
Esempi comuni di redirect 301 per la SEO
SINGOLO REDIRECT
Redirect 301 pagina1.html http://www.miosito.com/pagina2.html
DA NON WWW A WWW
RewriteBase / RewriteCond %{HTTP_HOST} ^miosito.com [NC] RewriteRule ^(.*)$ http://www.miosito.com/$1 [L,R=301]
DA WWW A NON WWW
RewriteBase / RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
DA INDEX A ROOT
RewriteEngine on RewriteCond %{THE_REQUEST} ^.*/index.html RewriteRule ^(.*)index.html$ http://www.miosito.com/$1 [R=301,L]
DA HTTP A HTTPS
RewriteEngine on RewriteCond %{HTTPS} off RewriteRule (.*) http://%{HTTPS_HOST}%{REQUEST_URI} [L,R=301]
DA HTTPS A HTTP
RewriteEngine on RewriteCond %{HTTPS} on RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
DA VECCHIO DOMINIO A NUOVO DOMINIO HTTP
RewriteEngine on RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^(www\.)?nuovodominio\.it$ [NC] RewriteRule .* http://www.nuovodominio.it%{REQUEST_URI} [R=301,L]
DA VECCHIO DOMINIO A NUOVO DOMINIO HTTPS
RewriteCond %{HTTPS} on RewriteCond %{HTTP_HOST} !^(www\.)?nuovodominio\.it$ [NC] RewriteRule .* https://www.nuovodominio.it%{REQUEST_URI} [R=301,L]
REDIRECT URL CON QUERY STRING
RewriteEngine On RewriteCond %{REQUEST_URI} ^/pagina\.php$ RewriteCond %{QUERY_STRING} ^id=([0-9]*)$ RewriteRule ^(.*)$ http://www.miosito.com/page/%1.php [L,R=301]
Oltre ai metodi segnalati ne esistono molti altri ed ogni tipo di redirect è una storia a parte in base alle esigenze che si hanno ed in base alla struttura url con cui si a che fare.
Articoli correlati
Sono un Consulente in Digital Marketing con oltre 10 anni di esperienza. Mi occupo di progettare e sviluppare strategie digitali per Piccole e Medie Imprese per aiutare le aziende ad ottenere il massimo ritorno dagli investimenti nei canali online.
Ciao,ho letto diversi blog e devo complimentarmi con te perché molto chiaro. Non trovo però mai risposta a questo caso redirect 301
Da: http://www.miosito.it/cartella/titolo?lang=it
A: http://www.miosito.it/cartella/titolo
Ciao Nico,
prova questa regola:
RewriteCond %{QUERY_STRING} lang=it
RewriteRule ^cartella/titolo /cartella/titolo? [L,R=301]
Grazie Stefano per l’articolo.
Volevo chiederti un ulteriore informazione: dovrei reindirizzare più pagine, posso utilizzare un unico file .htaccess con più righe? o devo fare più file .htaccess?
Ciao Maria,
il file .htaccess è uno solo. All’interno puoi inserire più reindirizzamenti singoli, ciascuno su una riga, o una regola di reindirizzamento che gestisce più url.
grazie!
Ciao Stefano,
anche io ti faccio i complimenti per i contenuti che posti.
Ho due domande per te:
1. è possibile fare un redirect da https:// a http:// anche se non si possiede un certificato ssl usando il seguente codice?
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Vorrei farlo in caso qualcuno digitasse https://www.miosito.com. Questo per farlo atterrare sul mio sito senza il warning del sito non protetto e (agli occhi dei neofiti) un sito poco sicuro.
2. Oggi ho istallato w3 total cache e mi sono accorto di 2 cose:
1. quando modifico un elemento (grafico o testo) del mio sito e poi salvo, con chrome lo vedo subito aggiornato, mentre su firefox e safari vedo ancora la pagina senza la nuova modifica. Per aggiornarlo devo ogni volta svuotare la cache e non sempre funziona subito (a volte devono passare dei minuti). Mi stupisce questa cosa!!!
2. Quando visualizzo il link della mia sitemap /sitemap_index.xml su chrome è ok, mentre su firefox e safari è ok al momento ma se svuoto la cache le “classiche” colonnine link del sito sitemap diventano semplici scritte una a fianco all’altra (senza più la possibilità di cliccarci su).
Spero tu mi possa aiutare.
GRAZIE,
Fabio
Ciao Fabio,
ti rispondo di seguito:
1 – La regola di redirect che hai indicato è corretta (anche se andrebbe testata per il caso specifico) e reindirizza la versione https:// a quella http:// a prescindere dalla correttezza o meno del certificato ssl. La cosa che mi sembra strana però è l’utilizzo di un redirect di questo tipo se il tuo sito non ha una versione ssl. Solitamente è difficile che una persona possa arrivare ad una versione https di un sito a meno che questa non sia indicizzata da un motore di ricerca o linkata da qualche parte.
2 – Probabilmente dipende dal browser dove sei loggato all’amministrazione WP. Provo a spiegarmi. W3 Total Cache agisce sulla cache del browser quindi se fai una modifica al sito ma non cancelli la cache del sito non vedi la modifica effettuata. Questo si può evitare se ci si logga all’backend di wp in quanto il plugin riconosce che sei l’amministratore e dovrebbe, in autonomia, ripulire la cache e farti vedere la modifica. Nel caso in cui effettui la modifica da chrome (da loggatto) e poi la testi su firefox e safari (senza loggarti) è normale che il cambiamento si veda solo su chrome. Il mio consiglio è comunque di pulire sempre la cache del plugin quando effettui delle variazioni sul sito.
3 – Anche in questo caso è un problema di cache del plugin/browser. Il mio consiglio per testare la correttezza della sitemap è utilizzare lo strumento Test Sitemap presente all’interno di Search Console (https://support.google.com/webmasters/answer/183669?hl=it). In questo modo puoi scoprire eventuali errori di formattazione, url non accessibili o attributi non validi.
Ciao Stefano e grazie per la tua pronta risposta!
Quindi il problema di non visualizzare le ultime modifiche apportate al mio sito è solo un “problema” mio in quanto ADMIN oppure anche tu, se in quel momento visualizzavi il mio sito, non avresti visto le ultime modifiche?
Non ho ben capito cosa devo fare quando dici “questo si può evitare se ci si logga al backend di wp”. Non sono un tecnico e questa proprio non l’ho capita 😉
Ad ogni modo se la soluzione è pulire la cache del plugin prima di fare la modifica, mi sembra una cosa fattibile.
TI FACCIO UN’ALTRA DOMANDA, SE POSSO…
Sto cercando di ottimizzare il sito perché, dopo aver fatto il check sia su Google Page Speed Insights che Pingdom, ho avuto un feedback molto migliorabile (diciamo così).
Uno dei principali warning che rallentano il mio sito sono i plugin di facebook e twitter che inserisco nelle pagine del mio sito.
Io utilizzo (forse da neofita) il codice che mi dice facebook su https://developers.facebook.com/docs/plugins/like-button e quindi incollo il seguente codice dopo il tag:
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = “//connect.facebook.net/it_IT/sdk.js#xfbml=1&version=v2.6”;
fjs.parentNode.insertBefore(js, fjs);
}(document, ‘script’, ‘facebook-jssdk’));
E QUESTO ALTRO nel punto in cui desidero venga visualizzato il bottone like e condividi:
IL PROBLEMA, e me ne accorgo, è che mentre il contenuto della pagina è stata già caricata, bisogna attendere ancora 1/2 secondi prima che il bottone sociale venga anch’esso caricato (questo ovviamente penalizza la velocità del sito e, di conseguenza, il suo posizionamento).
TU SAI SE C’E’ UN’ALTERNATIVA MOLTO PIU’ EFFICACE E VELOCE CHE MI PERMETTA DI INSERIRE I PLUGIN SOCIALI NELLE VARIE PAGINE SENZA PENALIZZARE LA VELOCITA’ DI CARICAMENTO DEL SITO?
Io utilizzo per il 90% il bottone facebook like e condividi + il plugin dei commenti facebook (sul blog).
Grazie ancora Stefano!
Fabio
Ciao Fabio,
le modifiche che effettui al sito quando il plugin di cache è attivo vengono viste solo dall’amministratore del sito se loggato (quindi tu), tutti gli altri vedranno il sito non modificato finché non ripulisci la cache del plugin.
Per quanto riguarda la velocità del sito legata al caricamento dei bottoni social ti posso dire che è un problema comune. I pulsanti social per potersi attivare fanno delle chiamate ai rispettivi server e a seconda di diversi fattori il caricamento può avvenire in modo lento. Più pulsanti inserisci, più il sito rallenta. Per ovviare a questo problema si può forzare il caricamento delle risorse che servono al plugin in modo asincrono così da far caricare più risorse contemporaneamente e velocizzare il caricamento del sito (per esempio per il pulsante di Facebook è sufficiente aggiungere js.async=true; all’interno dello script – https://geekflare.com/load-facebook-like-and-share-button-faster/).
Se utilizzi un cms come wordpress per il tuo sito, esistono vari plugin che permettono di inserire i bottoni social in modo ottimizzato. Quello che ti consiglio di fare è: se hai un cms provare vari plugin o estensioni e vedere quale è più performante nel tuo caso. Se inserisci i bottoni manualmente seguire le documentazioni ufficiali per implementare i plugin nel modo ottimale.
Ciao Stefano,
grazie per la tua risposta. Ho appena aggiunto js.async=true; e in realtà non è cambiato nulla. Il bottoncino di fb si carica sempre un po’ dopo. Ho spostato il codice del plugin nel footer del sito per alleggerirlo di più, ma boh non mi sembra ci siano grandi differenze.
Adesso procedo con l’ottimizzazione delle immagini (quasi tutte in png). Leggevo che è meglio caricarle in jpg (confermi?). Qualcuno conosce uno strumento (senza essere tecnici/grafici) per ottimizzare le immagini MANTENENDO la qualità?
Grazie!
Fabio
Ciao Fabio,
per quanto riguarda il caricamento del bottone Facebook purtroppo più di tanto non si può fare (il pulsante fa delle chiamate esterne al tuo sito web). Per le immagini invece il consiglio generale è di cercare di comprimerle al massimo a prescindere dal formato. JPEG e PNG sono entrambi formati validi per il web (potresti addirittura usare il GIF); quello che cambia e che permette al sito di caricare le immagini più velocemente è la riduzione di peso che riesci ad applicare alle foto senza comprometterne la qualità percepita.
Lato strumenti se hai Photoshop ti consiglio di utilizzare l’opzione “Salva per il web” e provare i vari tipi di compressione per il formato jpeg. Altrimenti puoi utilizzare qualsiasi software di editing grafico o tool come VSO Image Resizer per eseguire una compressione massiva di più file contemporaneamente.
Ho una domanda per risolvere un mio problema.
La mia necessità è quella di eseguire un redirect da http://www.sitouno.it verso un https://www.sitodue.it ma l’utente finale deve vedere solo http://www.sitouno.it – Siccome potrebbe sfuggire faccio notare che SITO UNO è HTTP e SITO DUE è un HTTPS.
Ho posto la domanda ad un paio di esperti ma mi dicono che non si può fare. Chiedo se avete soluzioni da proporre. Grazie
P.S. io di mestiere faccio altro ma se avete suggerimenti molto tecnici ed elaborati non c’e’ problema….I vostri suggerimenti verranno inoltrati a persone esperte che credo capiranno il nostro linguaggio.
Altra cosa: Non ponete limiti nelle soluzioni tanto io sono cliente di TOPHOST, ARUBA e possegg
o uno SPAZIO in affitto in CLOUD quindi i miei siti girano su OVH. GRAZIE
Ciao Alessandro,
non credo di aver compreso appieno la tua situazione. Hai due siti, SITO 1 e SITO 2 e vorresti fare un redirect da 1 a 2. E fino a qui non ci sono problemi. Il dubbio mi viene quando mi dici che l’utente deve vedere solo SITO 1. Se vuoi che veda solo il SITO 1 perché vuoi reindirizzare al 2? La tua domanda implicita riguarda per caso la possibilità di fare un redirect con uno scopo SEO, quindi un 301 (ad esempio) da SITO 1 a 2 che sia visibile solo ai MdR (es Google) ma non agli utenti?
Se il dubbio è questo ti posso dire che tecnicamente è fattibile, nel senso che puoi effettuare dei reindirizzamenti basandoti (ad esempio) sullo USER AGENT e scrivere una regola di rewrite tramite .htaccess che una volta individuato Googlebot o altri bot dei MdR reindirizzi al sito 2. O ancora, potresti effettuare un 301 solo per determinati IP (e impostare come target gli IP di Google o altri motori). Il problema è che questo metodo viola le Norme sulla Qualità di Google, essendo a tutti gli effetti una pratica di Cloacking (https://support.google.com/webmasters/answer/66355?hl=it) e queste pratiche potrebbero portare il tuo sito ad essere penalizzato.
Ciao stefano..
grazie per l’articolo, purtroppo non riesco ad applicare gli esempi al mio problema..
dovrei indirizzare i vecchi indirizzi dello stesso dominio
http://www.miosito.it/?pag=sezione&name=valore
a
http://www.miosito.it/valore
ho provato così
RewriteCond %{REQUEST_URI} ^/index\.asp/$
RewriteCond %{QUERY_STRING} ^name=([a-zA-Z0-9\_-]*)$
RewriteRule ^(.*)$ https://www.miosito.it/%1 [L,R=301]
ma va sempre verso la pagina che ho creato “pagina non trovata”
cosa sbaglio?
grazie in anticipo
Ciao Salvo,
per il tuo caso la regola di rewrite da utilizzare è leggermente diversa da quella che hai scritto tu in quanto i parametri nell’url sono due, e tu hai bisogno di sfruttare il secondo. Una regola che potrebbe andare bene è la seguente:
RewriteEngine On
# Controlla se l’url contiene query string contenente i parametri pag & name
RewriteCond %{QUERY_STRING} ^pag=(\d+)&name=(\w+)
# Reindirizza la pagina name=valore a /valore/
RewriteRule ^$ /%2 [L,R=301]
Considera che non sapendo con precisione cosa possono contenere i due parametri page e name, ho ipotizzato che pag contenga un valore numerico (quindi lo agganci con (\d+) e name un valore testuale, quindi (\w+). Se non è così utilizza in entrambi i casi (\w+).
Non ho testato la regola ma dovrebbe funzionare.
Fammi sapere.
Un saluto
Stefano
Ciao Stefano,
Grazie della guida, io avrei bisogno di imporre un redirect solo ad uno specifico IP dal mio sito ad una pagina esterna.
é possibile?
Grazie
Ciao Fabio,
puoi utilizzare il comando remote_addr per creare un regola di redirect tramite il file .htaccess.
Prova così:
RewriteEngine on
RewriteCond %{REMOTE_ADDR} ^111\.111\.111\.111$
RewriteRule .* http://www.tuosito.it [R=301,L]
Sostituisci il tuo ip a quello presente nell’esempio sopra.
Ciao Stefano e complimenti per il tuo ottimo articolo!
Non ho però trovato una soluzione per il problema che ho rilevato sul mio sito da qualche giorno.
Wordpress per ogni articolo ha creato delle URL del tipo: https://www.ideegreen.it/uccelli-esotici-110612.html/uccelli-esotici
che si vanno ad aggiungere alla URL originale del tipo:
https://www.ideegreen.it/uccelli-esotici-110612.html
Quale riga di comando posso aggiungere nel mio .htaccess per reindirizzare tutte le URL “fittizie” verso le URL “originali”?
Grazie 1000 per tue eventuali risposte!
Se poi riesci anche a capire per quale motivo si sono create queste URL fittizie (su tutti gli altri miei siti in WordPress il problema NON si presenta) raddoppio i ringraziamenti! 🙂
Un saluto e buon lavoro,
Matteo
Ciao Matteo,
per caso la comparsa degli url è successiva all’aggiornamento di un plugin o del tema? Hai provato a vedere se la struttura permalink di WordPress è cambiata? Il consiglio che ti do, se hai aggiornato qualcosa di recente, è di provare a ripristinare una versione vecchia del plugin/tema e vedere se l’errore si risolve.
Comunque una regola di rewrite che potresti applicare è la seguente:
RewriteRule ^(.*\.html)(\/.*)$ $1 [R=301,L]
Sfruttando la funzione dei gruppi (parentesi) puoi reindirizzare tutti gli url che presentano un qualche contenuto dopo il .html verso la path che termina con .html.
Considera che è una regola molto generale e potrebbe crearti dei reindirizzamenti che non ti servono. Per personalizzarla bisogna capire se e quali sono gli elementi comuni della struttura url delle pagine che hanno il problema.
Se i contenuti non sono tanti ti consiglio di fare dei redirect singoli.
Stefano
Ciao Stefano, grazie 1000 per la tua rapidissima risposta.
La regola che mi hai indicato funziona perfettamente per risolvere il mio problema. Nei prossimi giorni proverò a vedere se ha controindicazioni relativamente a possibili implementazioni di redirect “indesiderati” ma non penso.
Per quanto riguarda la causa resta un mistero: la prima cosa che ho fatto è stato controllare la struttura dei permalink e di confrontarla con altri miei siti con template identico, stessi plugin ma senza il problema delle URL duplicate (es. http://www.latuaauto.com http://www.viaggievacanze.com e http://www.marketingefinanza.com ) ma tutto sembra identico. Riproverò a controllare. Penso anch’io che la causa sia qualche plugin che crea la duplicazione ma ripeto sono gli stessi per tutti i siti e con la stessa versione!
In ogni caso ancora grazie per la regola e buon weekend,
Matteo
Ciao Matteo,
prova a vedere anche qualche funzionalità del tema. I due url effettivamente portano a contenuti diversi (nella versione con il percorso url dopo il .html se non sbaglio si vede solo l’immagine dell’articolo e non il testo).
Magari non si tratta di una duplicazione involontaria ma di una funzionalità del tuo tema o di qualche plugin che genera una pagina statica dove viene inserita la risorsa immagine del post.
Stefano
Stefano buongiorno,
sto effettuando una migrazione totale di 4 siti verso uno unico di gruppo quindi non esisteranno più le stesse pagine del vecchio.
Come posso impostare l’htaccess in modo che reindirizzi tutto alla home? E’ una buona idea oppure meglio fare una pagina 404 con call to action?ù
Grazie in anticipo
Buongiorno Max,
non esiste una scelta corretta o sbagliata in assoluto; dipende molto da come vuoi impostare il progetto. Ad esempio, se ogni contenuto dei 4 siti che stai migrando trova un contenuto equivalente all’interno del nuovo sito, probabilmente la soluzione migliore è impostare una regola di redirect 301 che rimandi l’utente dalla pagina del vecchio sito a quella corrispondente del nuovo (in questo caso va creata una regola di redirect specifica che crei la corrispondenza tra vecchio url e nuovo url).
Se nel nuovo sito invece i contenuti non sono stati migrati 1 ad 1 ma c’è comunque una corrispondenza tra vecchi e nuovi contenuti potresti reindirizzare tutti gli utenti alla home page del nuovo sito (a prescindere dalla pagina del vecchio).
In questo caso nell’.htaccess di ogni singolo vecchio sito puoi inserire la seguente regola:
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.vecchiosito.com$ [OR]
RewriteCond %{HTTP_HOST} ^vecchiosito.com$
RewriteRule ^(.*)$ http://www.nuovosito.com/ [R=301,L]
Il 404 è una scelta che non ti consiglio in caso di migrazione. Può essere invece una soluzione utile utilizzare uno status code 410 nel caso in cui parte dei contenuti vecchi siti in qualche modo hanno ancora una propria validità (e quindi rimangono online) mentre altre informazioni sono obsolete e non sono state trasferite nel nuovo sito. In questo caso puoi utilizzare uno status code 410 per i contenuti obsoleti in modo che vengano rimossi dall’indice di Google.
Stefano buongiorno,
Ho consultato diversi blog ma non trovo niente per un redirect del genere:
vecchio.it/?page_id=390 verso nuovo.sito.it
Sapresti suggerire una regola da utilizzare?
grazie
Buongiorno Matteo,
prova questa regola:
RewriteCond %{HTTP_HOST} =vecchio.it
RewriteCond %{QUERY_STRING} ^page_id=390
RewriteRule ^(.*)$ http://nuovo.sito.it [R=301,L]
Fammi sapere se funziona.
Un saluto
Stefano
[…] alla pagina equivalente col nuovo nome di dominio, per fare ciò è sufficiente utilizzare una regola di redirect tramite il file .htaccess (evitate di reindirizzare tutte le pagine del sito all’home […]
Ciao, io ho un problema in pratica ho effettuato il redirect 301 da http a https che funziona su tutti i link tranne su quelli delle immagini che si trovano nella cartella wp-content/upload/link-immagine.jpg
Come mai? Anche se non sono indicizzati questi link Google mi segnala gli errori di mancato reindirizzamento. Devo fare finta di nulla?
Questo è il codice che l’hosting mi ha consigliato di utilizzare. C’è differenza tra [R=301,L] o [L,R=301]:
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Ciao Agostino,
la regole di redirect che segnali è pensata per forzare l’https su qualsiasi risorsa che non sia https e dovrebbe comprendere anche le immagini. I motivi per cui non funzionerebbe per le immagini potrebbero essere molteplici.
Verifica innanzitutto che nel file .htaccess non ci siano altre regole di reindirizzamento specifiche per le immagini o che non ci siano plugin attivi che in qualche modo “forzino” l’http.
Per quanto riguarda i flag [R=301,L] l’ordine è indifferente (https://httpd.apache.org/docs/2.4/rewrite/flags.html). Il flag R=301 specifica il tipo di redirect mentre il flag L interrompe l’elaborazione del set di regole se la regola specifica corrisponde.
Prima di tutto grazie per la risposta.
Per regole di reindirizzamento specifiche per le immagini intendi tipo l’hotlink? L’unica parte di codice del file htaccess che potrebbe riguardare questo malfunzionamento è questa (il resto riguarda W3 Total cache che penso sia meglio non toccare):
RewriteCond %{HTTP_REFERER} !^http://sito.it*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://sito.it$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.sito.it/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.sito.it$ [NC]
RewriteCond %{HTTP_REFERER} !^https://sito.it/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^https://sito.it$ [NC]
RewriteCond %{HTTP_REFERER} !^https://www.sito.it/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^https://www.sito.it$ [NC]
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule .*\.(jpg|jpeg|gif|png|bmp|)$ – [F,NC]
Il motivo del mancato reindirizzamento potrebbe essere Cloudfare? Forse devo attivare la funzione che forza il caricamento con https?
La regola che mi indichi fa riferimento all’hotlinking (altri siti che tentano di includere le tue immagini), quindi non c’entra con il problema dell’https.
Se utilizzi Cloudflare potrebbe dipendere a quello. Prova a sentire il tuo hosting per la corretta configurazione di Cloudflare. Magari come hai giù intuito potrebbe bastare l’attivazione della funzione che forza l’https.
Salve, ho visitato diversi blog e non sono riuscito a trovare il seguente redirect
in pratica mi serverebbe la regola che mi permette di fare una serie di redirect specifici e tutte le altre richieste che vengono reindirizzate dal dal vecchio sito verso il nuovo E vanno in 404, devono essere reindirizzati verso una pagina scelta sul sito nuovo, mi potrebbe aiutare?
Sito vecchio –> verso il sito nuovo,
pagina sito vecchio 1 –> verso la pagina sito nuovo…
(Poi) Ogni richiesta sito vecchio –> sito nuovo = 404 —> redirect pagina x sito nuovo
Ciao Marco,
non sono sicuro di aver capito bene la tua esigenza.
Il primo redirect che indichi, sito vecchio verso sito nuovo, è la stessa cosa del secondo che indichi, pagina A sito vecchio verso pagina A sito nuovo. Per questo tipo di redirect, se non cambia la struttura URL tra vecchio e nuovo sito basta fare una regola di redirect che intercetta il percorso url completo e cambia solo il dominio, altrimenti devi mapparti i vecchi url e creare redirect singoli specifici per il nuovo.
Ad esempio, se devi reindirizzare (do per scontato che come redirect intendi il 301) tutte le pagine specifiche del vecchio dominio verso le corrispondenti sul nuovo (compresa la home page) potresti utilizzare una regola simile a questa:
Per quanto riguarda invece il discorso delle richieste 404 non ti consiglio di procedere con un redirect 301 massivo. Se hai effettuato bene i reindirizzamenti dei contenuti da vecchio a nuovo sito viene meno l’esigenza di reindirizzare tutte le risorse che hanno status code 404 verso una pagina del sito.
Un redirect ha senso se effettivamente il contenuto è stato spostato da una parte ad un’altra e non tutte le risorse di un sito che possono restituire uno status 404 sono necessariamente contenuti migrati. Inoltre, con una regola di questo tipo, vai a coinvolgere anche risorse che nel vecchio sito non c’erano, che sono state presenti sul nuovo e che per qualche motivo ora non sono più raggiungibili.
Premesso ciò online ho trovato questa regola che potresti testare:
Stefano Salustri, grazie della risposta.
Comunque intendevo le URL interne sul sito nuovo diverse rispetto al sito vecchio.
Sito vecchio.it —> sito Nuovo.it
Sito vecchio/ciao-mondo —> sito Nuovo/prova1
Provo entrambe le regole e ti faccio sapere se hanno funzionato.
Ciao Stefano,
una domanda: posso fare un redirect del sito http://www.sitoweb.com a http://www.sitoweb.net mettendo questo redirect sul .htaccess del .net?
Al contrario non ho dubbi, ma come ti ho chiesto io è possibile?
Ciao Francesca,
non è possibile. Puoi gestire i redirect del solo sito che controlli.
Stefano
Ciao Stefano e complimenti per l’articolo, che a quanto pare ha suscitato molto interesse. Anche il mio 🙂
Ti chiedo una cortesia:
Devo reindirizzare un sito: sitoa.com verso altro: sitob.com, il quale ha tutte le url uguali di sitoa.com tranne ovviamente il nome a dominio.
Esempio:
sitoa.com/pagina1/
sitoa.com/pagina2/
sitoa.com/pagina3/
…
verso
sitob.com/pagina1/
sitob.com/pagina2/
sitob.com/pagina3/
….
Come posso eseguire i redirect 301? C’è un pattern di regole invece che reindirizzare le url una ad una , visto che cambia solo il dominio?
Grazie mille
Ciao Marco,
potresti utilizzare una regola tipo questa:
RewriteEngine On
RewriteEngine On
RewriteRule ^(.*)$ https://www.sitob.com.com/$1 [R=301,L]
alla quale puoi aggiungere un controllo sul dominio di partenza, es:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.*)sitoa.com$
RewriteRule ^(.*)$ https://www.sitob.com.com/$1 [R=301,L]
Stefano
Ciao Stefano,
la mia esigenza è quella di effettuare un redirect da sito con www a senza www, in pratica sarebbe cosi:
https://www.miosito.it
a
https://miosito.it
la regola è questa:
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
ma non ho compreso a pieno dove inserire i due indirizzi del sito.
Grazie anticipatamente.
Ciao Luigi,
la regola di redirect che indichi va inserita nel file .htaccess del sito. In questo caso il redirect viene applicato al dominio dove si trova il file, quindi non devi specificare nessun indirizzo del sito.
Se vuoi specificare il dominio puoi utilizzare questa regola:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^tuosito.it [NC]
RewriteRule ^(.*)$ http://www.tuosito.it/$1 [L,R=301]
Stefano
Ciao Stefano, intanto volevo ringraziarti l’articolo !
io ho installato il plugin wordpress “really simple SSL” per HTTPS.
Ma l’URL “http: // esempio . Com” richiede due redirect per arrivare a
” https: //www.esempio . Com”.
Come posso creare un redirect manuale nel htaccess che lo fa accedere in un solo passaggio e senza che vada in conflitto con il plugin?
Grazie mille
Ciao Luca,
ti consiglio di utilizzare o il Plugin Really Simple SSL o le regole di redirect tramite .htaccess per evitare problemi. Una regola che puoi utilizzare è la seguente:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^esempio.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.esempio.com [NC]
RewriteRule ^(.*)$ https://www.esempio.com/$1 [L,R=301,NC]
Un redirect dove vengono inseriti circa 500 url diventa pesante?
Grazie
Ciao Riccardo,
500 non sono tanti. Ti consiglio comunque, se fattibile, di impostare una regola che gestisca più redirect piuttosto che inserire 500 singoli redirect.
Stefano