Com realitzar la redirecció interna amb mod_rewrite a Apache


En aquest article i en el següent explicarem com utilitzar mod_rewrite, per assignar certes sol·licituds HTTP a altres pàgines d'un lloc web o a una URL externa.

És a dir, aquest conegut mòdul d'Apache us permetrà redirigir una URL a una altra, que il·lustrarem mitjançant exemples pràctics.

NOTA: Els exemples següents suposen que esteu almenys una mica familiaritzat amb les expressions regulars compatibles amb Perl (PCRE). Com que aquest tema està fora de l'abast d'aquest article, consulteu els documents de la versió 24.0 de Perl 5 per obtenir més detalls sobre PCRE.

Abans de continuar, assegureu-vos que el mòdul de reescriptura estigui carregat. Tot i que aquest és el comportament predeterminat a CentOS i distribucions similars, a Debian i derivats haureu de carregar-lo manualment de la següent manera:

# a2enmod rewrite

Configuració d'Apache per utilitzar el mòdul mod_rewrite

Per simplificar, utilitzem el lloc predeterminat en un quadre CentOS 7 (IP 192.168.0.100) per explicar com utilitzar mod_rewrite (DocumentRoot: /var/www/html, fitxer de configuració: /etc/httpd/conf/httpd.conf).

Per tal que Apache utilitzi aquest mòdul, afegiu la línia següent al fitxer de configuració:

RewriteEngine on

És important tenir en compte que aquesta configuració no serà heretada pels amfitrions virtuals a la mateixa caixa.

Per tant, haureu d'afegir RewriteEngine per a cada host virtual on vulgueu utilitzar regles de reescriptura.

Una redirecció interna és l'exemple més senzill de mod_rewrite. Si voleu redirigir totes les sol·licituds de default.aspx a index.html, afegiu la línia següent (també coneguda com a regla de reescriptura) a RewriteEngine a:

RewriteRule "^/default\.aspx$" "/index.html"

i no oblideu reiniciar Apache perquè els canvis tinguin efecte.

Això pot ser útil si el vostre lloc es va dissenyar originalment amb ASP i després es va canviar a HTML5 normal. Els motors de cerca tindran el fitxer .aspx indexat però aquest fitxer ja no existeix.

En aquest cas, haureu de trobar una manera de redirigir la sol·licitud perquè els vostres visitants potencials no es trobin amb una pàgina d'error. Per provar, creem un fitxer HTML senzill anomenat index.html dins de /var/www/html amb el contingut següent:

<!DOCTYPE html>
<html>
  <head>
	<meta charset="utf-8">
	<title>New site</title>
  </head>
  <body>
	<h2>Default.aspx was here, but now it's index.html</h2>
  </body>
</html>

Els signes de dòlar i de cursor faran que l'expressió regular coincideixi amb qualsevol cadena que comenci per /default i acabi amb .aspx, respectivament.

Ara inicieu el vostre navegador i apunteu-lo a 192.168.0.100/default.aspx. Si les coses van com s'esperava, Apache hauria de publicar index.html.
Tanmateix, l'usuari final encara veurà default.aspx a la barra d'adreces i farà que el canvi sigui totalment transparent:

Si voleu que l'URL de la barra d'adreces mostri que el servidor al qual en realitat està mostrant index.html en lloc d'una pàgina anomenada default.aspx, afegiu [R, L] fins al final de la regla de reescriptura de la manera següent:

RewriteRule "^/default\.aspx$" "/index.html" [R,L]

Aquí [R,L] hi ha dos indicadors opcionals que indiquen que s'ha d'emetre una redirecció HTTP completa al navegador (R) i que no s'ha de processar cap regla:

Observeu com ara la barra d'adreces mostra index.html, com s'esperava, en lloc de default.aspx com ho feia abans.

En aquest article vam explicar com utilitzar mod_rewrite per realitzar la redirecció interna. Estigueu atents a la propera publicació on aprendrem a redirigir a un recurs que s'ha mogut a un servidor diferent i a reescriure les marques.

Com sempre, no dubteu a utilitzar el formulari de comentaris a continuació si teniu cap pregunta o comentari sobre aquest article. Esperem amb interès tenir notícies teves!