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.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:
Array
(
[id] => test
[cat] => 123
)
capiremo di aver invertito $1 con $2.. 
3.1- Ottimizzazioni
Tre consigli:- se possibile, caricare le regole nella configurazione (ad ogni accesso, il file .htaccess viene aperto, letto, parsato, chiuso..)
- evitare trasformazioni stupide (es .php -> .html) - ai fini dell'ottimizzazione non cambia assolutamente niente
- usare [L] (va inserito quasi sempre) per non far testare a mod_rewrite le regole successive.
| | | |
| | Array | E' una struttura dati complessa usata in molti linguaggi di programmazione | | |
| | | |
| | | |
| | Browser | Un browser web (sfogliatore di documenti web) è un programma che interpretail codice delle pagine web e lo visualizza in forma di ipertesto | | |
| | | |
| | | |
| | Forum | Il Forum è uno strumento di comunicazione dove l'utente può inserire i propri post. Quando in un forum si apre una nuova discussione si crea un topic che potrà essere seguito da molti reply. | | |
| | | |
| | | |
| | HTML | HTML (HyperText Markup Language) nasce per mano di Tim Berners-Lee, il costruttore del primo webserver e del primo browser, come estensione di SGML (Standard Generalized Markup Language) nel 1990. | | |
| | | |
| | | |
| | Hosting | Servizio che consiste nell'allocare su un server web le pagine di un sito web, rendendolo cosí accessibile dalla rete internet. | | |
| | | |
| | | |
| | Thread | Indica il termine italiano discussione, nei forum. | | |
| | | |
| | | |
| | URL | (Uniform Resource Locator) è un indirizzo di una risorsa in Internet | | |
| | | |
| | | |
| | PHP | E' una piattaforma trasversale lato server scripting language utilizzata per la creazione di pagine web dinamiche | | |
| | | |
| | | |
| | Semantica | La semantica è quel settore della linguistica che studia il significato delle parole (semantica lessicale), delle frasi (semantica frasale), dei testi e degli insiemi delle parole. | | |
| | | |
| | | |
| | VPS | Acronimo di Virtual Private Server (Server virtuale privato). Esso è una "porzione" virtuale (partizione) di una macchina fisica, che però appare completamente indipendente rispetto alle altre analoghe. In tal modo si riesce a sfruttare un singolo sistema hardware per generare più ambienti software distinti, separati e auto-consistenti. | | |
| | | |
| | | |
| | Server | Ogni coppia hardware-software che fornisce appunto servizi ad utenti chiamati tradizionalmente clienti (clients) attraverso una rete. | | |
| | | |
| | | |
| | Unix | Sistema operativo portabile adattato agli standard POSIX; multiutente, multitask, basato su un mix di paginazione e segmentazione, aperto. | | |
| | | |
| | | |
| | Filosofia | Attività intellettuale che punta ad elaborare una concezione complessiva e razionalmente fondata della realtà, del mondo e dell'uomo. Usato anche come sinonimo di 'sistema di pensiero'. In senso figurato, saggezza, imperturbabilità, serenità d'animo. | | |
| | | |
| | | |
| | debug | L'attività di ricerca e correzione degli errori logici che si manifestano utilizzando un software. Svolta sia da umani - programmatori e utenti occasionali - sia da specifici programmi, detti 'debuggers'. | | |
| | | |