Per molti l’unico modo per poter rendere amichevoli gli urls è quello di usare il modulo mod_rewrite di apache, metodo molto comodo da utilizzare. Ma come fare se il nostro hosting non ha attivato il mod_rewrite? bisogna utilizzare una semplice classe che permette di controllare che tipo di url è stato richeisto. Per capirci meglio vediamo un esempio.
- url con query: http://www.dominio.it/index.php?c=casa&f=affitto
- url amichevole con mod_rewrite: http://www.dominio.it/casa/affitto/
- altro url amichevole: http://www.dominio.it/index.php/casa/affitto/
L’url con query è il clasico indirizzo che viene generato nei siti intenet dinamici, inquesto caso realizzati con il PHP. Questo url non è molto digeribile per i motori di ricerca, ma è anche difficile da ricordare per l’utente in quanto deve ricordarsi diverse variabili nel caso l’url sia complesso. Gli altri due esempi sono gli urls più graditi ai motori di ricerca e permettono quindi una migliore indicizzazione dei motori di ricerca. Per il no stroscript useremo il secondo esempio di url amichevole.
Come possiamo ottenere l’url http://www.dominio.it/index.php/casa/affitto/ ? Di solito con il PHP è più semplice passare i dati attraverso le query, ma vedremo che ci sono metodi altrettanto semplici per farlo. Per poter creare il nostro ulr amichevole useremo la variabile $_SERVER implementata dalla versione 4.1.0 del PHP, nelle versioni precedenti invece veniva usata la variabile $HTTP_SERVER_VAR. La variabile $_SERVER non è altro che un array contenente le informazioni come, header, percorsi e path degli script. Tutte le chiavi presenti in questo array vengono create dal Web server, di conseguenza esiste la possibilità che non sempre siano reperibili, dal momento che non tutti i Web server si comportano esattamente allo stesso modo. Per evitare incompatibilità è consigliabile verificare che nell’array sia presente la variabile PATH_INFO.
Ora però passiamo alla creazione della nostra classe. Per prima cosa creiamo un file che chiameremo uri.php al cui interno scriveremo:
<?php
class uri {
var $uri_string;
var $segments = array();
var $uri_protocol = ‘auto’;
function fetch_uri_string() {
if (strtoupper($this->uri_protocol) == ‘AUTO’) {
if (is_array($_GET) AND count($_GET) == 1) {
$this->uri_string = key($_GET);
return;
}
$path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv(‘PATH_INFO’);
if ($path != ” AND $path != ‘/’ AND $path != “/”.$_SERVER['PHP_SELF']) {
$this->uri_string = $path;
return;
}
$path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv(‘QUERY_STRING’);
if ($path != ” AND $path != ‘/’) {
$this->uri_string = $path;
return;
}
$path = (isset($_SERVER['ORIG_PATH_INFO'])) ? $_SERVER['ORIG_PATH_INFO'] : @getenv(‘ORIG_PATH_INFO’);
if ($path != ” AND $path != ‘/’ AND $path != “/”.$_SERVER['PHP_SELF']) {
$this->uri_string = $path;
return;
}
} else {
$uri = strtoupper($this->uri_protocol);
if ($uri == ‘REQUEST_URI’) {
$this->uri_string = $this->parse_request_uri();
return;
}
$this->uri_string = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri);
if ($this->uri_string == ‘/’) {
$this->uri_string = ”;
}
}
}
function parse_request_uri() {
if (!isset($_SERVER['REQUEST_URI']) OR $_SERVER['REQUEST_URI'] == ”) {
return ”;
}
$request_uri = preg_replace(“|/(.*)|”, “\\1″, str_replace(“\\”, “/”, $_SERVER['REQUEST_URI']));
if ($request_uri == ” OR $request_uri == $_SERVER['PHP_SELF']) {
return ”;
}
$fc_path = $_SERVER['PATH_INFO'];
if (strpos($request_uri, ‘?’) != FALSE) {
$fc_path .= ‘?’;
}
$parsed_uri = explode(“/”, $request_uri);
$i = 0;
foreach(explode(“/”, $fc_path) as $segment) {
if (isset($parsed_uri[$i]) AND $segment == $parsed_uri[$i]) {
$i++;
}
}
$parsed_uri = implode(“/”, array_slice($parsed_uri, $i));
if ($parsed_uri != ”) {
$parsed_uri = “/”.$parsed_uri;
}
return $parsed_uri;
}
function explode_segments() {
foreach(explode(“/”, preg_replace(“|/*(.+?)/*$|”, “\\1″, $this->uri_string)) as $val) {
// Filter segments for security
//$val = trim($this->_filter_uri($val));
if ($val != ”)
$this->segments[] = $val;
}
}
function segment($n, $no_result = FALSE) {
return ( ! isset($this->segments[$n])) ? $no_result : $this->segments[$n];
}
}
?>
nella nostra classe bisogna impostare solamente il parametro uri_protocol che di default è impostato su auto, ma possiamo impostare anche:
- QUERY_STRING (per url tipo index.php?c=casa&f=affitto)
- REQUEST_URI (per ottenere cartella/index.php/casa/affitto/ o cartella/index.php?c=casa&f=affitto)
- PATH_INFO (per ottenere le informazioni sul path)
- ORIG_PATH_INFO (variabile da utilizzare in mancanza di PATH_INFO)
Un mio consiglio per evitare che il vostro server vi dia errori è quello di lasciare la variabile uri_protocol impostata su auto. In questo modo sarà la nostra classe a preoccuparsi di trovare il metodo migliore per ottenere informazioni dal nostro path.
Ora vediamo come è possibile richiamare ed utilizzare la nostra classe
<?php
include(‘uri.php’);
$uri = new uri;
$uri->fetch_uri_string();
echo $uri->uri_string;
echo “<br><br>”;
$uri->explode_segments();
print_r($uri->segments);
echo “<br><br>”;
echo $uri->segment(0);
echo “<br><br>”;
?>
Per prima cosa abbiamo inizializzato la nostra classe uri ($uri = new uri) per poi richiamare la funzione per il controllo dell’url tramite $uri->fetch_uri_string().
Poi abbiamo creato l’array della variabile $segments tramite $uri->explode_segments() e abbiamo stampato a video il primo valore contenuto nell’array ($uri->segment(0)). per leggere il contenuto dell’array $segments attraverso $uri->segments(n), dove n è il numero dell’elemento contenuto nell’array, biisogna partire a contare da zero e non da uno.
Attraverso il nostro script con un indirizzo del tipo index.php/casa/affitto/ avremo come risultato il primo valore dopo il nome del file, cioè casa.
Ora il vostro sito verrà indicizzato più facilmente dai motori di ricerca.
Condividi su: