Tutorial Intermedio a Mod_Rewrite

by admin admin Date: 11-04-2013


1 Cosa fa il mod rewrite ?

Il mod rewrite serve per il vostro server apache a far si che le pagine dinamiche (in questo caso in php) cambino totalmente estensione e sembrino pagine html statiche

2 Per cosa serve la trasformazione da dinamiche a statiche ?

Questa trasformazione serve a far si che la vostra pagina venga assimilata meglio da un motore di ricerca. Un motore di ricerca potrebbe avere qualche difficoltà a seguire un link del genere:
codice:

http://www.esempio.it/index.php?page=notizie&id=69

Allora tramite il rewrite dell'url potremo trasformare il link sopra in una pagina di questo tipo:
codice:

http://www.esempio.it/index/notizie/69.html

Una pagina di questo tipo vi garantisco(l'ho provato personalmente nella mia piccolissima esperienza) è decisamente meglio vista dai motori di ricerca (google in primis)
Io in questo caso ho utilizzato 2 variabili nella mia url in php :

    * page
    * id

Ovviamente maggiori saranno le variabili minore sarà la considerazione che avrà della vostra pagina il motore di ricerca.

3 Come posso far si che il mio apache mi accetti il rewrite ?

- A -Per fare questo dovrete aver caricato un modulo di apache chiamato appunto mod_rewrite

mod_rewrite.c

Per fare questo dovrete andare nel file di configurazione di apache: httpd.conf e decommentare le seguenti righe
codice:

LoadModule rewrite_module modules/mod_rewrite.so

AddModule mod_rewrite.c

Fatto questo restartare apache .
- B - Provate a lanciare un file con dentro scritto :

codice PHP:
 


phpinfo();

Adesso nella pagina che otterrete cercate dove c'e scritto Loaded Modules e se vi sarà scritto mod_rewrite sarete pronti a partire per iniziare il vostro viaggio per quanto riguarda la riscrittura dei vostri indirizzi!!

La maggior parte di noi (credo) si trova in host presso server in cui ovviamente non potrà modificare il file di configurazione al chè passate immediatamente al punto - B - e vedrete subito se sul vostro server il servizio è attivo.

4 Ok sul mio server il servizio è attivo cosa devo fare ?

Allora partendo dal presupposto che il rewrite funziona sia su macchine con OS windows che Linux(io in locale l'ho fatto su win e in hosting su linux).
Dovrete creare un file che chiameremo .htaccess .
Dentro questo file dovremo scrivere la regola che vogliamo far interpretare al nostro web server.
Vi faccio 3 esempi di quello che si può fare (poi chi è più bravo di me con le espressioni regolari può fare miracoli):


* * * ESEMPIO 1 * * *

Se noi ad esempio utilizzassimo il sistema di template in php messo a disposizione dall'esempio del sito pho.html.it
QUI L'ARTICOLO : http://www.holyguard.net/articoli/id_582/idcat_31/pro.html

e qui l'esempio :
http://151.1.209.132/ft/index.php

Avremo delle pagine dimaniche di questo tipo :
codice:

www.sito.com/index.php?page=notizie&id=69

Cosa significa questo ?
Significa che noi stiamo utilizzando 2 pagine e 2 variabili:

Le pagini in questo caso sono index.php che avrà come codice una cosa più o meno simile
codice PHP:


$p="main";  //pagina di default per i contenuti centrali
if(isset($_GET['page'])){  //pagina passata via parametro
    $p=$_GET['page'];
    if($p!=basename($p) || !preg_match("/^[A-Za-z0-9-_]+$/",$p) || $p=="index" || !file_exists($p.".php"))
        $p="error";     //pagina di errore
    }
    include($p.".php");



Cioè include le pagine che le vengono passate tramite la variabile $page(?page=nomepagina) nella pagina che si sta visualizzando

E poi c'è la pagina notizie.php che riceve i valori dalla variabile $id (&id=) e che la utilizzerà più o meno in questo modo :
codice PHP:


$query = mysql_query("Select * from notizie where id='$_GET[id]'");
Allora avrete l'url detto in precedenza :
codice:

http://www.sito.com/index.php?page=notizie&id=69

Ma tra poco lo trasformeremo in una pagina di questo tipo:
codice:

http://www.sito.com/index/notizie/69.html

Per farlo non dovrete far altro che nel file .htaccess scrivere la seguente regola:
codice:

RewriteEngine On
RewriteRule ^index/([^/]+)/([^/]+).html index.php?page=$1&id=$2 [L]

E questa vi permette di fare la trasformazione dei link come detto sopra

* * * ESEMPIO 2 * * *

Il mio sito ha soltanto una variabile nell'url di questo tipo
codice:

http://www.sito.com/notizie.php?id=69

Come dovrà essere la mia regola per il file .htaccess ??
codice:

RewriteEngine On
RewriteRule ^notizie/([^/]+).html notizie.php?id=$1 [L]

Questa mi permetterà di trasformare la pagina in
codice:

http://www.sito.com/notizie/69.html

* * * 3 ESEMPIO * * *

Questo non differisce molto dai primi 2 ma serve soltano a far capire che ampio utillo si possa fare del rewrite:

Supponiamo che io utilizzi la classe fpdf per creare al volo file in formato .pdf
Per fare questo avremo delle pagine con dentro la query al db per estrapolare i dati e poi le varie istruzioni per la classe:

codice PHP:


$query = mysql_query("Select * from notizie where id='$_GET[id]'");

//............. etc etc

//includiamo la classe
require('fpdf.php');

$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Image('img/logo.jpg', 50, -10, 105, 48);
$pdf->SetTextColor(255,080,100);
$pdf->write(8, "                              $titolo\n\n");
$pdf->SetTextColor(0,0,0);

$pdf->write(8, "-Autore: $autore\n\n");
$pdf->write(8, "Testo: $testo\n");
...... etc etc

Per richiamare il file pdf scriveremo una url di questo tipo qui :
codice:

http://www.sito.com/pdf_notizie.php?id=69

Invece tramite il nostro rewrite potremo creare un finto (o fasullo come preferite) file pdf vero e proprio:
codice:

http://www.sito.com/pdf_notizie/69.pdf

A tutti gli effetti sembra davvero un file pdf mai più andremmo a pensare che in realtà è una pagina in php
Per realizzarlo basta scrivere nel rewrite questo:
codice:

RewriteEngine On
RewriteRule ^pdf_notizie/([^/]+).pdf pdf_notizie.php?id=$1 [L]

Cioè cambiare semplicemente l'estensione nella regola.
Un pochino più sofisticato potrebbe essere anche utizzare nell'url cosa di questo tipo:
codice:

http://www.sito.com/notizie/69-titolo-notizia.html

Questo serve (a quanto ho letto nell'ultimo mese nella sezione motori di ricerca di questo forum e da quanto ho visto nelle varie agenzie di SEO = search engine optimized) a far digerire ancora meglio le nostre pagine ai vari MDR.
La rule che dovrete usare sarà sempre la stessa:
codice:

RewriteEngine On
RewriteRule ^notizie/([^/]+).html notizie.php?id=$1 [L]

però nella vostra pagina php (cioè la notizie.php) userete il comando explode e metteremo questo :

codice PHP:


$pagina = $_GET[id];
$divisore = explode("-", $pagina);
$id =  $divisore[0];// ti restituisce il numero che hai prima del -
$query = mysql_query("Select * from notizie where id='$id'");

Spero di essermi spiegato in modo chiaro e che vi possa essere utile

 

 
by admin admin Date: 11-04-2013 visite : 2366