Ti sei perso il VI Convegno gt? Forse puoi rimediare... www.convegnogt.it X Chiudi
 
Forum GT: Condividiamo idee e conoscenza Forum GT: Condividiamo idee e conoscenza


Condividi questo contenuto nei Social Network:
Ti stiamo aspettando: Registrati subito e gratis. Entra a far parte di una delle comunità più attive in Italia. Se hai dimenticato i tuoi dati li puoi recuperare subito.


Vai indietro   Forum per Webmaster: Condividiamo Idee e Conoscenza > Seo e Tecnologie > Mod Rewrite e Tecniche di URL Redirect
Benvenuto! Forum Regole FAQ Lista utenti Calendario Segna come letti

Mod Rewrite e Tecniche di URL Redirect La riscrittura delle URL e i reindirizzamenti

Hey Amico Visitatore,
Condividi con noi le tue idee e la tua conoscenza Aprendo una nuova discussione nella sezione Mod Rewrite e Tecniche di URL Redirect


Rispondi
 
LinkBack (1) Strumenti di discussione
Vecchio 30-07-07, 17:38   1 links from elsewhere to this Post. Click to view. #1 (permalink)
Esperto
 
L'avatar di osvi
 
Data di registrazione: Jul 2006
Ubicazione: Siena
Messaggi: 1,077
Guida al mod_rewrite

Appena inserita su WikiGT: Guida mod_rewrite
Vi riporto qui sotto il testo, postate liberamente le vostre richieste.

-> Per la correzione dei (pochi ) errori potete modificare direttamente la voce sul wiki.
-> Per chiarimenti sul contenuto della guida (relativo al contenuto stesso) potete rispondere direttamente in questo thread
-> Per le altre richieste vi prego di aprire un nuovo thread, in modo da tenere ogni situazione separata dalle altre e tenere il forum ordinato. Grazie!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~



Nonostante le tonnellate di esempi e documentazione, mod_rewrite è voodoo.
Voodoo dannatamente figo, ma sempre voodoo.
-- Brian Moore
Piccola guida al mod_rewrite - contiene le informazioni base da sapere per utilizzare questo utilissimo modulo. La guida anche se orientata ad Apache è ovviamente valida (per la parte teorica) ad IIS / ISAPI rewrite.

INDICE:
- Prima di cominciare
- Uno sguardo da vicino
- mod_rewrite in pratica
- Per i più bravi

Stando in linea con la filosofia del forum, questa guida non è legge ma solo un contributo alla comunità (che mi auguro ricambi, segnalando errori o ampliando le sezioni).


__________________________________________________
Prima di cominciare

0.0- Requisiti
- conoscenza base delle espressioni regolari


__________________________________________________
Uno sguardo da vicino

1.0- Cosa è il mod_rewrite
mod_rewrite è un modulo per Apache, il webserver più usato nel mondo Unix. Il modulo associa "al volo" un URL virtuale (non residente sul filesystem) ad uno reale, tramite delle regole definite nei file .htaccess

1.1- Come si attiva

Se sei in un hosting condiviso, non devi fare niente: il modulo è attivo di default nella maggior parte dei casi. In ogni caso prima di acquistare un piano d'hosting chiedi esplicitamente se il modulo è installato!

Se lavori invece su un tuo server dedicato / VPS / localhost, molto probabilmente devi attivare il modulo a mano:
- per Apache2 a2enmod rewrite come root
- per Apache1 è necessario decommentare la linea LoadModule mod_rewrite nel file di configurazione

Apache di default ignora i file .htaccess (e di conseguenza le tue regole!) - per farglieli leggere devi modificare la direttiva AllowOverride all'interno del file di configurazione. Ricorda di riavviare il webserver.

1.2- La prova del nove
Per controllare se il modulo funziona:
Livello 1) crea una pagina .php contenente
Codice PHP:
<?php phpinfo(); ?>
Richiamala dal browser e cerca nella pagina mod_rewrite sotto Loaded Modules. Se trovi la stringa, vuol dire che il modulo è caricato.
Attenzione!! Caricato in memoria non vuol dire utilizzabile - infatti se il modulo è presente, ma i file .htaccess vengono ignorati (vedi sopra), le regole di riscrittura non funzioneranno! Per questo entra in gioco il
Livello 2) testare se effettivamente gli indirizzi vengono riscritti: scarica questo file e segui le istruzioni contenute nell'archivo stesso.

1.3- Struttura di un file .htaccess
Riporto la struttura "base" di un file .htaccess contenente una semplice regola

Codice:
RewriteEngine On
RewriteRule ^index.html$ fooindex.php [L]
La prima linea attiva l'engine (va sempre inserita)
La seconda linea specifica una regola (RewriteRule) composta da:
  • l'URL da riscrivere, tra ^ (inizio stringa) e $ (fine stringa), quasi sempre formato da espressioni regolari
  • l'URL al quale inviare la richiesta
  • parametri (tra parentesi quadre, separati da virgole)
    • L "ultimo" -> paragonabile al break, dice all'engine di fermarsi e di non controllare le altre regole
    • R=301 -> invia un header di contenuto spostato in modo permanente e crea il redirect
    • R=302 -> invia un header di contenuto spostato in modo temporaneo e crea il redirect
    • QSA "accoda query string" -> se l'URL richiesto contiene più parametri di quelli previsti, vengono accodati - utile se si vogliono mettere parametri a pagine con indirizzi riscritti (!!).
Inserendo queste due righe in domain.tld/.htaccess, quando un utente visita domain.tld/index.html il webserver invia la pagina domain.tld/fooindex.php. L'utente non si accorge di niente.
Deep focus:
- se fooindex.php non esiste, l'utente vede "404 fooindex.php", anche se ha richiesto index.html
- index.html può anche non esistere: il webserver invierà al client direttamente il file php senza neppure curarsi del file html
__________________________________________________
mod_rewrite in pratica

2.0- Let's check it out!
Procediamo per casi analizzando alcuni URL-tipo che ognuno di noi ha incontrato almeno una volta. Sono solo degli esempi, riadattabili alle proprie esigenze. Il consiglio è di leggere in modo lineare tutti i casi, e non solo la parte finale.

Lo scenario è la sezione news di un sito.
Ricordate che in ogni file htaccess dovete inserire, prima delle regole, la direttiva RewriteEngine On.

2.1- Riscrittura "base"
URL prima dell'intervento: www.domain.tld/news/index.php?id=1234
URL dopo l'intervento: www.domain.tld/news/notizia-1234.html

Codice:
RewriteRule ^notizia-([0-9]+)\.html$ index.php?id=$1
- ([0-9]+) uno o più (+) caratteri numerici da 0 a 9 ([0-9])
- \.html indica ".html" (. è un metacarattere che vuol dire qualsiasi carattere, dobbiamo effettuare l'escape).
- $1 viene sostituito con il valore "trovato" dalla regexp ([0-9]+)

Ok, abbiamo tolto la querystring (hai detto niente!). Ma non è proprio il sistema più raffinato e la semantica è a 0.


2.2- Gestire più parametri
URL prima dell'intervento: www.domain.tld/news/index.php?id=1234&cat=recensione
URL dopo l'intervento: www.domain.tld/news/recensione-1234.html

Codice:
RewriteRule ^(.+)-([0-9]+)\.html$ index.php?id=$2&cat=$1
Consiglio: invece di usare (.+) (qualsiasi carattere in qualsiasi quantità) è più saggio usare ([^/]+) che vuol dire "qualsiasi carattere tranne lo slash in qualsiasi quantità".
2.3- Associazioni tra ID e stringhe
URL prima dell'intervento: www.domain.tld/news/categoria.php?id=2
URL dopo l'intervento: www.domain.tld/news/recensioni.html

Codice:
RewriteRule ^([^/]+)\.html$ index.php?nomecat=$1
Codice PHP:
$cat $_GET['nomecat'];
$categoria mysql_query("SELECT id FROM categorie WHERE nome='$cat'");
if (
mysql_num_rows($categoria)==0) {
    
Make404(......);
} else {
    
$categoria mysql_num_rows($categoria);
    
$news mysql_query("SELECT .... FROM news WHERE categoria='$categoria[0]'");
    
ShowNews(......);

Nota bene: è possibile eliminare l'ID contenuto nell'URL se e solo se la corrispondenza ID<->stringa è biunivoca!


2.4- Il caso ideale
URL prima dell'intervento: www.domain.tld/news/index.php?id=1234
URL dopo l'intervento: www.domain.tld/news/recensioni/php6-usera-goto-1234.html

Codice:
RewriteRule ^([^/]+)/([^/]+)-([0-9]+)\.html$ index.php?id=$3&cat=$1&titolo=$2
Codice PHP:
$newsid $_GET['id']; // non serve fare il cast con (int)
$news mysql_query("SELECT ... FROM news WHERE id='$newsid'");
if (
mysql_num_rows($news)==0) {
    
Make404(......);
} else {
    .....
    
// supponiamo di avere in $cat la categoria letta dal database
    // e in $titolo il.. titolo ovviamente
    
if ($cat != $_GET['cat'] || ottimizza($titolo) != $_GET['titolo']) {
       
// è stato cambiato titolo o categoria
       
make301('http://www.domain.tld/news/' $cat '/' $titolo '-' $newsid '.html');
    }

    
NewsClass:ShowNews(......);

  • la funzione ottimizza deve essere la stessa usata per mostrare gli URL nella pagina con l'elenco delle news per evitare problemi di doppi-redirect e serve per eliminare spazi, caratteri accentati, ecc.
  • la funzione make301 deve inviare un header 301, un header location e bloccare lo script (con exit; )
  • la semantica di questi URL è molto buona (un file chiamato come la news contenuto in una directory correlata)
  • se la news viene spostata di categoria o rinominata, viene automaticamente generato un header 301 invece di un 404 (come su questo forum)
=> new! scarica questo esempio
__________________________________________________
Per i più bravi

3.0- Quando qualcosa non funziona

La direttiva RewriteLog permette di salvare l'output di debug di mod_rewrite su un file, ma va inserita nel file di configurazione principale di Apache, e in un hosting condiviso ciò non è possibile.

Per vedere quali pezzi di url (e in che modo) vengono riconosciuti, basta usare uno script con questo semplice contenuto
Codice PHP:
<pre>
<?php print_r($_GET);
</
pre>
Codice:
RewriteRule ^(.+)-(.+)\.html$ debugger.php?id=$1&cat=$2
Richiamando nel browser la pagina test-123.html:
Quote:
Array
(
[id] => test
[cat] => 123
)
capiremo di aver invertito $1 con $2..


3.1- Ottimizzazioni
Tre consigli:
  1. se possibile, caricare le regole nella configurazione (ad ogni accesso, il file .htaccess viene aperto, letto, parsato, chiuso..)
  2. evitare trasformazioni stupide (es .php -> .html) - ai fini dell'ottimizzazione non cambia assolutamente niente
  3. usare [L] (va inserito quasi sempre) per non far testare a mod_rewrite le regole successive.
__________________
Firefox browser

Ultima modifica di osvi : 07-04-08 00:04.
osvi non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 30-07-07, 18:03   #2 (permalink)
 
L'avatar di Giorgiotave
 
Data di registrazione: Oct 2004
Ubicazione: Monasterace
Messaggi: 34,261
Invia un messaggio tramite Skype a Giorgiotave
Ottimo Lavoro Osvi

Mettiamo in rilievo per un pochino
__________________
Giorgio Taverniti Blog - Il mio account Twitter!

Che aspetti? Diventa MODERATRICE del Forum gt !!!
Giorgiotave ora è in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 30-07-07, 18:06   #3 (permalink)
Esperto
 
L'avatar di Andrez
 
Data di registrazione: Mar 2005
Ubicazione: Sull'isola del giorno prima
Messaggi: 8,238
Complimenti !
__________________
Il Blog di Andrez
Andrez non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 31-07-07, 00:27   #4 (permalink)
Moderatore
 
L'avatar di massimux
 
Data di registrazione: Apr 2006
Ubicazione: Napoli
Messaggi: 762
Invia un messaggio tramite MSN a massimux Invia un messaggio tramite Skype a massimux
che guidona thx ^_^
__________________
Perchè non ti fermi?
Da bravo Moderatore, Modero con Moderazione il Moderabile
massimux non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 02-08-07, 00:56   #5 (permalink)
User Attivo
 
L'avatar di stable
 
Data di registrazione: Nov 2006
Ubicazione: Sicilia
Messaggi: 1,314
Invia un messaggio tramite Skype a stable
Ottima ed utilissima guida. Ancor di più l'idea di far scaricare l'esempio!
__________________
Immigrazione dot biz - 2.0 is on line
stable non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 03-09-07, 14:10   #6 (permalink)
Moderatore
 
L'avatar di massimux
 
Data di registrazione: Apr 2006
Ubicazione: Napoli
Messaggi: 762
Invia un messaggio tramite MSN a massimux Invia un messaggio tramite Skype a massimux
nell'esempio non usi il 301 è un errore o è fatto apposta?
__________________
Perchè non ti fermi?
Da bravo Moderatore, Modero con Moderazione il Moderabile
massimux non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 03-09-07, 15:38   #7 (permalink)
Moderatore
 
L'avatar di massimux
 
Data di registrazione: Apr 2006
Ubicazione: Napoli
Messaggi: 762
Invia un messaggio tramite MSN a massimux Invia un messaggio tramite Skype a massimux
hai caricatoo tutti i file? lo vedi nell'ftp il file htaccess?

lo script funziona per funzionare

la mia domanda è sempre:

Quote:
massimux Visualizza il messaggio
nell'esempio non usi il 301 è un errore o è fatto apposta?
__________________
Perchè non ti fermi?
Da bravo Moderatore, Modero con Moderazione il Moderabile
massimux non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 03-09-07, 15:40   #8 (permalink)
User
 
Data di registrazione: Sep 2005
Messaggi: 18
Quote:
massimux Visualizza il messaggio
hai caricatoo tutti i file? lo vedi nell'ftp il file htaccess?
Si si lo vedo...
atrus non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 03-09-07, 16:22   #9 (permalink)
Moderatore
 
L'avatar di massimux
 
Data di registrazione: Apr 2006
Ubicazione: Napoli
Messaggi: 762
Invia un messaggio tramite MSN a massimux Invia un messaggio tramite Skype a massimux
mi dai l'indirizzo? magari apri un nuovo topic in questa sezione in modo da non "sporcare"(andare fuori tema) la guida di osvi
__________________
Perchè non ti fermi?
Da bravo Moderatore, Modero con Moderazione il Moderabile
massimux non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 04-09-07, 21:04   #10 (permalink)
User
 
Data di registrazione: Apr 2005
Messaggi: 36
Invia un messaggio tramite MSN a haravin
ottima guida anche se su IIs le cose sono davvero tristi, ma tristi tristi...
in teoria funziona tutto, si installa Isapi rewrite, funziona benissimo ad ogni test e legge pure le espressioni regolari validandole...

ma non cambia un url che sia uno!!

Voto Apache e Linux per queste cose, su altro hosting Linux con Wordpress funzionavano tutte le combinazioni di url rewrite possibili.

Mi sà che su Windows 2003 e IIs è come andare con la Ferrari sullo sterrato, non è il suo!
__________________
http://www.giunti.info/gdrweb Giochi di ruolo
haravin non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 05-09-07, 02:01   #11 (permalink)
Esperto
 
L'avatar di osvi
 
Data di registrazione: Jul 2006
Ubicazione: Siena
Messaggi: 1,077
grazie massimux per avermelo fatto notare :-)

ho aggiornato lo ZIP.. il 301 era già mezzo inserito (nel file funzioni.php), chissà a che pensavo..

ho messo sia quello che controlla il titolo modificato, sia quello per gli url "prima del rewrite"

ciao!
__________________
Firefox browser
osvi non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 05-09-07, 12:27   #12 (permalink)
Moderatore
 
L'avatar di massimux
 
Data di registrazione: Apr 2006
Ubicazione: Napoli
Messaggi: 762
Invia un messaggio tramite MSN a massimux Invia un messaggio tramite Skype a massimux
lieto di esserti stato di aiuto avevo notato
__________________
Perchè non ti fermi?
Da bravo Moderatore, Modero con Moderazione il Moderabile
massimux non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 06-09-07, 03:13   #13 (permalink)
Moderatore
 
L'avatar di massimux
 
Data di registrazione: Apr 2006
Ubicazione: Napoli
Messaggi: 762
Invia un messaggio tramite MSN a massimux Invia un messaggio tramite Skype a massimux
ma se per il redirect301 avessimo usato [R=301] nell' .htaccess?
__________________
Perchè non ti fermi?
Da bravo Moderatore, Modero con Moderazione il Moderabile
massimux non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 02-10-07, 13:44   #14 (permalink)
User
 
Data di registrazione: Jul 2007
Messaggi: 67
Invia un messaggio tramite MSN a bitfan
Salve a tutti,
ottima la guida, per il mio nuovo sito ho creato il file htacces..il redirect funziona nel senso però che mi ridireziona tutto all'home page..ad esempio

RewriteRule ^index.php?option=com_content&task=view&id=55&Item id=80$ azienda.php [L,R=301]

può andare bene un record scritto così?
Grazie a tutti comunque
bitfan non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Vecchio 01-04-08, 01:05   #15 (permalink)
User
 
Data di registrazione: Feb 2006
Messaggi: 92
scusate la domanda stupida questa guida funziona solo per pagine php? se si per pagine asp come faccio?
__________________
http://www.locali-italiani.it
mixpax non in linea  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Segnalo this Post!OKNO this Post!
Rispondi citando
Rispondi
Tags: , , ,



Strumenti di discussione

Regole di scrittura
Non puoi postare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi allegare file
Non puoi editare i tuoi post

BB code is Attivo
smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Attivo
Pingbacks are Attivo
Refbacks are Disattivato
Vai al forum

LinkBacks (?)
LinkBack to this Thread: http://www.giorgiotave.it/forum/mod-rewrite-e-tecniche-di-url-redirect/46579-guida-al-mod_rewrite.html
Scritto da For Type Data
» URL Rewriting: prima o poi capiterai anche tu! - SEO Blog GT This thread Pingback 10-08-07 11:06



Tutti gli orari sono GMT +3. Attualmente sono le 16:42.




Forum GT - © 2004-2009 GT idea S.r.l P.iva 02418200800 - Privacy/Disclaimer

SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.