Riscrittura dell’url alternativa al mod_rewrite grazie al PHP

Pubblicato da Della Noce Carlo in: Utilità

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:
Se il blog ti piace diventa nostro fan su Facebook risolvi i tuoi problemi con il computer sul forum Ricevi gli articoli via email

Autore

Della Noce Carlo

Leggi anche:

Rispondi