BLOG

Impostare un redirect 301 tramite Apache, Php e Asp

September 12th, 2006 in Web Marketing

Un redirect 301 serve a comunicare agli spider dei motori di ricerca che una url non è più disponibile o che è avvenuto un cambiamento nella struttura delle url, per cui lo spider dei motori di ricerca deve essere reindirizzato verso la nuova url.

Durante il Search Engine Strategies di San Jose più volte è stato ribadito che è di fondamentale importanza evitare che lo spider dei motori si trovi davanti a pagine non più esistenti o che indicizzi contenuti duplicati. A tal proposito il sistema più veloce e sicuro è quello di utilizzare un “reindirizzamento permanente”, comunicando uno status code 301 nell’header della pagina.

Esistono diverse tecniche per impostare un redirect 301, l’unico limite è che tutte operano lato server, per cui non è possibile impostare uno status code 301 tramite semplice markup html.

APACHE è un server web, tramite il file .htaccess è possibile configuare alcuni parametri:

Redirect 301 /vecchia/url /nuova/url
oppure
Redirect Permanent /vecchia/url /nuova/url

Con una delle due istruzioni è possibile reindirizzare una vecchia url verso una nuova.

Tramite PHP è sufficiente inserire nell’intestazione della pagina non più disponibile il seguente codice:

header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.nuova-url.com/');

Infine in ASP, sempre nell’intestazione della vecchia pagina, andrebbe inserito il seguente codice:

Response.Status="301 Moved Permanently"
Response.AddHeader "Location","http://www.nuova-url.com/"

41 Responses

  • Simone Carletti 13 September 2006
    08:58

    Aggiungo anche, per apache,

    RedirectMatch 301 ^(pattern)$ /nuova/url/$1

    dove il patern è una espressione regolare che permette, ad esempio, di fare un redirect per ogni pagina del dominio in un colpo solo.

  • Benedetto Colicci 13 September 2006
    09:10

    Grazie per l’intervento, aggiungo che se tra i lettori qualcuno dovesse avere dei dubbi su come impostare un’espressione regolare specifica per il suo sito può tranquillamente postare un commento qui.

  • Madrefoca 14 October 2006
    14:53

    Ciao mi chiedevo se utilizzando il codice php

    per il redirect 301 si potesse aggiungere un countdown?

  • Benedetto Colicci 16 October 2006
    12:23

    Ciao,
    non ho ben capito la domanda, vuoi che appaia un countdown prima del redirect ?
    Penso che andrebbe gestito lato client il countdown, tramite javascript per poi lasciare al php il redirect. Andrebbe testato per capire la fattibilità.

  • Santino 6 November 2006
    10:24

    Cosa succede se uno lascia libero il campo location, mi spiego io ho eliminato delle pagine, come faccio a dire a Google che deve elimminarle?
    Mi conviene forse un sistema che prende magari delle parole chiavi e rimanda alla pagina di ricerca?

  • Benedetto Colicci 6 November 2006
    10:32

    Se elimini delle pagine devi impostare dentro htaccess un redirect 301 verso l’home del sito o verso le pagine che hanno sostituito le vecche. Naturalmente il redirect verrà eseguito solo se si tenta di accedere alle vecchie pagine.
    Le direttive sono RewriteCond e RewriteRule.

  • Marco 12 December 2006
    14:59

    RedirectMatch 301 ^(pattern)$ /nuova/url/$1

    dove il patern è una espressione regolare che permette, ad esempio, di fare un redirect per ogni pagina del dominio in un colpo solo.

    io avrei bisogno di fare un redirect 301 di tutte le pagine presenti su http://www.nomedominio.it/nomecartella a sottodominio.nomedominio.it mi potete aiutare?

    Grazie

  • Benedetto Colicci 12 December 2006
    18:11

    Ciao Marco,
    ipotizzando che utilizzi Apache:

    RewriteCond %{REQUEST_URI} ^/nomecartella
    RewriteCond %{HTTP_HOST} ^www\.nomedominio\.it
    RewriteRule (.*) http://sottodominio.nomedominio.it$1 [R=301,L]

  • marcuzzer 29 December 2006
    22:09

    ciao,
    per evitare di disperdere i la popolarità dei link entranti al mio sito vorrei operare un redirect 301 da

    sito.net

    a

    http://www.sito.net

    Ora, se ho capito bene, volendo usare la soluzione PHP dovrei cambiare il virtualHost nell’httpd.conf e, per sito.net, farlo puntare a una pagina redirect.php invece che all’attuale index.php. In questa pagine iserisco il codice sopra riportato.

    Corretto?

    altrimenti usando .htaccess cosa scrivo?

    Grazie

  • Benedetto Colicci 2 January 2007
    10:24

    Ciao,
    puoi usare .htaccess per gestire il redirect da un dominio ad un altro:

    RewriteEngine On

    # Redirect
    RewriteCond %{HTTP_HOST} ^sito\.net
    RewriteRule ^(.*)$ http://www.sito.net$1 [R=permanent,L]

  • tutto gratis 1 February 2007
    11:53

    Ciao a tutti ragazzi

    una domandona: se io volessi reinderizzare l’url
    http://www.sitomio.it/index.php

    a questo nuovo indirizzo

    http://www.sitomio.it

    comed devo fare?
    Grazie a tutti

  • Cristian 6 February 2007
    00:12

    Ciao.
    Sto tentando di rendere statiche le pagine dinamiche del mio sito. Prendiamo per esempio la pagina /ele_prod.php?cid=1

    Per poter utilizzare delle stringhe mirate nell’url, devo modificare l’url in questo modo:

    /ele_prod.php?vd=$tagurl&cid=1

    per questo non ho problemi. Naturalmente, credo di dover inserire un redirect nella pagina .php in questione, per non avere delle pagine duplicate. Inoltre, nel file .htaccess devo inserire il rewrite e un nuovo redirect 301. Ho scritto le seguenti istruzioni:

    Options +FollowSymLinks
    RewriteEngine on
    RewriteRule (.*)\(.*)\.html ele_prod.php?vd=$1&cid=$2
    RedirectMatch 301 ele_prod.php?vd=$1&cid=$2 (.*)\(.*)\.html

    Tutto ciò è corretto?

    Grazie in anticipo!

  • domenico 7 February 2007
    01:48

    Ciao,
    io vorrei tramite htaccess spostare ogni singola pagina nel nuovo dominio come ad esempio :
    sito/biografia/ a nuovosito/biografia

    Io sto provando questo ma non va:
    Redirect 301 /rock http://www.sito.it/rock/
    Cosa sbaglio?devo mettere qualcosa prima di questa riga? grazie mille :)

  • Benedetto Colicci 8 February 2007
    10:26

    Ciao Domenico,
    su che sistema hai provato il redirect ?
    Il problema potrebbe essere il match, forse dovresti usare:
    RedirectMatch 301 ^(pattern)$ /nuova/url/$1

  • Cristian 12 February 2007
    20:40

    Ciao.

    Vorrei sapere come mai, l’espressione:

    RewriteRule ^nuova-url.html http://www.miosito.com/vecchiaurl.php [L,R=301]

    effettua il redirect al contrario. In pratica, reindirizza la nuova pagina verso la vecchia! Ma non dovrebbe fare il contrario?

  • Benedetto Colicci 13 February 2007
    18:51

    Ciao,
    la vecchia url va prima, la sintassi corretta è
    Redirect 301 /vecchia/url /nuova/url

  • Cristian 15 February 2007
    00:07

    Ciao, Benedetto, e grazie per la risposta.

    Ho provato a scrivere:

    Redirect 301 /vecchiaurl /nuovaurl,
    ma la pagina non viene reindirizzata.

    Devo ancora aggiungere qualcosa, sull’htaccess? oppure potrebbe essere qualche problema del server Apache, o della sua configurazione?

  • Benedetto Colicci 15 February 2007
    10:35

    Ciao,
    questo metodo funziona solo per url esatte, per cui se devi reindirizzare solo una pagina verso la nuova url allora dovrebbe funzionare.
    Occhio che la seconda url forse la devi scrivere con http davanti:

    Redirect 301 /oldpath http://www.nuovaurl.com/

  • Cristian 15 February 2007
    18:10

    Ciao, Benedetto.
    Grazie di nuovo per l’esaustiva e risolutiva risposta.

    Ho applicato la regola del Redirect 301, ed ora è funzionante. Ho provato ad applicarla ad un caso specifico, cioè a seguito del Rewrite di una pagina, su server APACHE. L’intento è quello di reindirizzare la vecchia pagina Prova.php in una identica riscritta in .html. Ecco la regola sull’ .htaccess:

    RewriteEngine on
    RewriteBase /
    RewriteRule prova.html prova.php
    Redirect /prova.php http://www.miodominio.com/prova.html

    Quando cerco di accedere alla pagina prova.php, il sito resta in fase di caricamento per un pempo enorme, non visualizzando ne la vecchia, ne la nuova pagina, come se si creasse un loop.

    Riesci a capire dove sta il problema?

    Grazie mille.

    Eventualmente (una volta che imparo la tecnica…) posso rispondere ad eventuali altre domande quì sul blog?

  • fabrizio 22 February 2007
    13:26

    Salve a tutti,
    io vorrei reindirizzare il vecchio sito verso un altro nuovo mantenendo però il vecchio indirizzo.
    http://www.nomesito.com verso http://www.nomesito.altervista.com mantenendo però nella barra il vecchio indirizzo.
    Questo è possibile?

  • Benedetto Colicci 22 February 2007
    14:24

    Per Cristian:
    Non puoi usare quelle due righe in quel modo, va in loop, prpva a togliere il RewriteRule

    Per Fabrizio:
    No, non è possibile, dovresti usare i frames e caricare il nuovo sito in un frame interno.


  • [...] Il primo permette di ottenere una e-mail ogniqualvolta il server risponde con un errore 404. Mi è stato utilissimo: mi sono accorto che, avendo spostato un’intera categoria fuori dal loop, le pagine in essa contenute erano cercate dagli spider e, ovviamente, non individuate. A quel punto ho effettuato dei redirect 301 (leggi un ottimo articolo su questo argomento) via htaccess risolvendo definitivamente il problema. [...]

  • Rinzi 27 March 2007
    16:49

    Ciao Benetto,

    nell’esempio con codice ASP c’è un = di troppo

    Response.Status=”301 Moved Permanently”
    Response.AddHeader=“Location”,”http://www.nuova-url.com/”

    dovrebbe essere così

  • Benedetto Colicci 27 March 2007
    17:00

    Ciao Simone,
    grazie per la segnalazione, ho corretto il codice

  • marzia 23 April 2007
    18:39

    Ciao Benedetto,
    io vorrei fare un redirect permanente di un file php che genera moltissime pagine.
    Sarebbe un redirect da

    http://www.miosito.it/vecchionome.php?cat=1 (e numeri successivi)

    a

    http://www.miosito.it/nuovonome.php?cat=1 ecc

    Mi potresti dire cosa devo scrivere in htaccess?
    Grazie!

  • Alibrando 29 May 2007
    10:15

    Ho variato un po di cose e ho scritto questi redirect e e questi revrite
    posto solo due o tre righe di esempio ma purtroppo sono oltre 100.

    redirect 301 /minestre.php http://www.miodominio.com/minestre.html

    poi ho pure:

    redirect 301 /minestre.php?page=ricetta&titolo=RIBOLLITA http://www.miodominio.com/ricetta-13-ribollita.html

    poi dopo i 301 ho:

    RewriteEngine on
    RewriteRule ^([^/]+)-([0-9]+)-([^/]+).html$ index.php?page=$1&titolo=$2&nome=$3 [L]
    RewriteRule ^([^/]+).html$ index.php?argomento=$1 [L]

    funziona quasi tutto, l’unico inconveniente è che se io scrivo la seguente url

    http://www.miodominio.com/minestre.php?page=ricetta&titolo=RIBOLLITA

    oppure:

    http://www.miodominio.com/ribollita.php

    mi da sempre come pagina

    http://www.miodominio.com/minestre.html

    solo che nel primo caso mi da:

    http://www.miodominio.com/minestre.html?page=ricetta&titolo=RIBOLLITA

    aprendo sempre la pagina minestre e giustamente non utilizza i parametri dopo .html

    La mia impressione è che legga solo il primo 301 che trova in lista ignorando il secondo.

    Esiste la possibilità di correggere questo problema che appare più per l’indicizzazione che per l’utente?

    Grazie in ogni caso.

  • Benedetto Colicci 30 May 2007
    10:32

    Ciao Alibrando,
    si il primo redirect fa terminare la lettura dell’htaccess, è importante l’ordine con cui fai eseguire le istruzioni.

    Per risolvere farei gestire tutto al rewrite engine, per cui scrivere il tuo il blocco di codice:
    RewriteEngine on
    RewriteRule ^([^/]+)-([0-9]+)-([^/]+).html$ index.php?page=$1&titolo=$2&nome=$3 [L]
    RewriteRule ^([^/]+).html$ index.php?argomento=$1 [L]

    Seguito dalle istruzioni di redirect utilizzando RewriteCond e RewriteRule [R=301,L]

  • Alibrando 30 May 2007
    13:22

    Grazie mille
    mi scuso di nuovo ma avrei bisogno di capire bene la sintassi da scrivere perchè ho provato in tanti modi ma ricevevo conflitti o non funzionava.
    prendendo per valida la prima parte del codice ovvero:

    RewriteEngine on
    RewriteRule ^([^/]+)-([0-9]+)-([^/]+).html$ index.php?page=$1&titolo=$2&nome=$3 [L]
    RewriteRule ^([^/]+).html$ index.php?argomento=$1 [L]

    Come dovrei usare il RewriteCond e RewriteRule [R=301,L] per redirigere la riga:

    redirect 301 /minestre.php http://www.miodominio.com/minestre.html

    e la riga:

    redirect 301 /minestre.php?page=ricetta&titolo=RIBOLLITA

    Ti prego di perdonare queste mie richieste che forse ti portano via tempo.

    Grazie in ogni caso

  • massimo 14 June 2007
    17:53

    Qualcosa mi sfugge… chi ha un idea?

    Ho una RewriteRule nell’htaccess di questo tipo:

    RewriteRule ^area_([^.]+)_categoria([^.]+)_([^.]+)_pag([^.]+).html$ index.php?&area=$1&sottoarea=$2&nome=$3&id=$4 [T=application/x-httpd-php]

    ma vorrei fare in modo che sulla barra dell’indirizzo venisse cmq mantenuta la $QUERY_STRING.

    Ovvero, tramite un accesso del tipo:

    http://www.miosito.it/area_diprova_categoria0_cianfrusaglie_pag334.html?parametro=abcdefghijkl

    desiderei che rimanesse scritto ?parametro=abcdefghijkl

    …che in Apache corrisponde appunto al $QUERY_STRING.

    invece lo perdo…

    :-( help me!

  • lollo 14 February 2008
    16:33

    buongiorno, qualcuno sa se è possibile reindirizzare http://www.miononno.it verso http://www.miozio.it ma fare in modo che il browser visualizzi sempre http://www.miononno.it ?

    è tecnicamente possibile?

    grazie!

  • dam 23 February 2008
    18:27

    vrei bisogno di dirottare tutto il contenuto di una directory verso
    un’altra senza però cambiare l’url…quindi pensavo ad utilizzare
    rewriterule…

    Questo comando messo in htaccess funziona però mi viene cambiato
    l’url:

    redirect 301 /directory/ http://www.nomesito.com/directory/

    Qualcuno mi può aiutare?

  • Michele 29 February 2008
    12:03

    Ciao a tutti,
    avrei la necessità sotto apache di far gestire tutte le richieste ad una pagina php.

    Per esempio, se da browser si scrive:
    http://www.nomedominio.it/dir1/dir2
    la richiesta dovrebbe essere indirizzata a:
    http://www.nomedominio.it/index.php
    ma sul browser deve restare la richiesta originale.

    Ho fatto un redirect del 404 con
    ErrorDocument 404 /index.php
    però le richieste $_GET restano ma perdo i $_POST.

    Come posso fare?

  • luigi 18 March 2008
    15:44

    Ciao!

    Vorrei chiedere una cosa su delle righe dicodice che ho immesso nel file htaccess per avere conferma di aver scritto giusto anche se attualmente funziona …

    RewriteEngine On

    RewriteBase /
    RewriteCond %{HTTP_HOST} !^miosito\.it [NC]
    RewriteRule ^(.*)$ http://miosito/$1 [L,R=301]
    Redirect /index.php http://miosito/sito/
    Redirect /index.php http://www.miosito/sito/

    per chiarimento specifiche che si tratta di uno spostamento in una sottocartella lasciando comunque una index nella root e del doppio dominio …

    Grazie per leventuale risposta.

  • Benedetto Colicci 9 April 2008
    08:53

    l’esempio è un pò troppo “astrattro” ad esempio:
    RewriteCond %{HTTP_HOST} !^miosito\.it [NC]
    RewriteRule ^(.*)$ http://miosito/1 [L,R=301]

    misito/1 ? manca il .it o il .com per cui o è un errore o solo nell’esempio non è riportato….

  • Franco 8 November 2008
    19:23

    Ciao,
    anch’io ho un problema con il rewrite: al’interno dello stesso sito dovrei fare puntare le pagine da:
    http://www.miosito.it/costante1/costante2/costante3=variabile1/costante4=variabile2/costante5=variabile3
    a
    http://www.miosito.it/costante6/variabile2/variabile3
    tenendo conto che gli apici e gli spazi contenuti nelle variabili 2 e 3 vanno sostituiti con trattini.
    Non saprei da che parte cominciare, in quanto ho già dei rewrite attivi, ma per indirizzi singoli. Qui si tratta di modificare oltre 1000 indirizzi.
    Si riesce a fare?

  • Domenico 30 November 2008
    12:23

    Ciao a tutti!!
    sto facendo dei cambiamenti tramite un Mod rewrite (su joomla) alla URL del mio sito.

    In pratica la vecchia URL è del tipo:

    hxxp://xxx.mio-sito.it/annunci-affitto/

    è stata modificata in:

    hxxp://xxx.mio-sito.it/affitto-casa/

    Il problema è che ho diciamo un 5000 pagine…. forse anche di +,
    ed i casi possibili delle pagine possono essere i seg.:

    hxxp://xxx.mio-sito.it/annunci-affitto/regione.html

    che dovrei reindirizzare a:

    hxxp://xxx.mio-sito.it/affitto-casa/regione.html

    poi,

    hxxp://xxx.mio-sito.it/annunci-affitto/regione/città.html

    che dovrei reindirizzare a:

    hxxp://xxx.mio-sito.it/affitto-casa/regione/città.html

    ed infine,

    hxxp://xxx.mio-sito.it/annunci-affitto/regione/città/titolo-annuncio-id.html

    che dovrei reindirizzare a:

    hxxp://xxx.mio-sito.it/affitto-casa/regione/città/titolo-annuncio-id.html

    In pratica io dovrei cambiare soltanto la stinga di URL /annunci-affitto/ in /affitto-casa/

    Ovviamente le pagine
    - regione.html
    - Città.html
    - titolo-annuncio-id.html

    e le cartelle
    - regione/
    - città/

    sono più di una (regione1.html, regione2.html, regione3.html ecc. e regione1/, regione2/, regione3/ ecc. ecc. ecc.)

    Sarei davvero grato a chiunque può aiutarmi ad impostare delle regole su htaccess….

  • Nicola 22 December 2008
    22:14

    Salve,
    purtroppo sono incappato in un hosting abbastanza “pessimo” ed ho un piccolo problema:
    tutte le pagine senza “www” non vengono caricate.
    Allora ho fatto questo:
    Ho rediretto i DNS * e @ del mio sito sul mio ip statico dove sta in esecuzione xampp always on così da intercettare le richieste, e poi ho fatto una index.php che mi trasforma le richieste senza www in richieste con www tramite il codice:

    putroppo non funziona come dovrebbe (a volte va, altre no).
    A me servirebbe un “redirect wild card” da “http://sito.ext/*” a “http://www.sito.ext/*” per qualunque valore di * in PHP (file, sottocartelle, variabili), ed ho a disposizione tutto apache per farlo, ma non so come.
    Mi potete aiutare?
    Sarebbe una grande cosa se potesse essere “indipendente” dal dominio, cioè ogni richiesta del tipo sito1.ext, sito2.ext… si trasformi automaticamente in http://www.sito1…, anche se la cosa non è fondamentale.
    Grazie.

  • Nicola 22 December 2008
    22:19

    Dimenticavo: ovviamente il sito NON si trova sul mio pc, devo solo “reindirizzare” la richiesta


  • [...] questo post di Benedetto, molto completo, su come impostare un redirect 301 attraverso i principali linguaggi [...]

  • Alessandro 1 March 2009
    15:04

    Ciao,
    io ho un problemino che ancora qui non ho visto trattato.

    Ho delle url del tipo http://www.dominio.it/prova.php?titolo=parola con spazi
    e voglio reindirizzare a
    http://www.dominio.it/prova/parola-con-spazi/

    Come si può fare con htaccess?

    Grazie
    Alessandro

  • lorenzo 10 March 2009
    16:21

    Ciao, avrei questa esigenza,, effettuare un redirect 301 su server windows di file da http://www.miosito/esempio/Nome-Cartella/ a http://www.miosito/esempio/nome-cartella/ . In altri termini vorrei portare tutti gli url in minuscolo, senza rischiare di far indicizzare due volte i contenuti a google.

    Grazie mille
    Lorenzo

Leave a Reply