Como utilizar MOD_REWRITE

MOD_REWRITE es un modulo del servidor web Apache que permite crear URL alternativas a nuestras páginas dinámicas de forma que sean mas fáciles de recordar y también mejor indexadas por los buscadores.

Esto nos permite que un URL de la forma:

  1. http://www.sample.com/producto.php?cat=monitor&subcat=lcd

Se pueda acceder mediante:

  1. http://www.sample.com/monitor/lcd/

Como Funciona?
Para utilizar MOD_REWRITE es necesario crear una serie de reglas basadas en Expresiones Regulares el cual permite identificar un determinado patrón y reescribirla. Internamente Apache procesará el URL resultante y se le mostrará al cliente.

Estas reglas se escriben y colocan en un archivo de configuración llamado .htaccess el cual se encuentra en la raíz del servidor donde se quieren aplicar estas reglas.

Utilizando MOD_REWRITE
Lo primero es crear un archivo .htaccess, en el cual incluimos código para activar la opción de reescritura y luego utilizamos el comando RewriteRule en donde pasamos dos parámetros, el primero de ellos es el URL que vamos a reemplazar y el segundo es el URL que utilizaremos de reemplazo.

Luego si deseamos convertir nuestro URL de ejemplo, utilizaremos el siguiente código.

  1. Options +Indexes
  2. Options +FollowSymlinks
  3. RewriteEngine on
  4. RewriteBase /
  5. RewriteRule ^(.*)/(.*)/ products.php?cat=$1&subcat=$2

Nótese que $1 representa la primera coincidencia y $2 la segunda coincidencia buscada en el URL. Ahora hay que notar que esto es para cuando se desea aplicar la regla a un URL que esta en la raiz del servidor. Si nuestro URL esta en una carpeta por ejemplo llamada rewrite, entonces cambiamos el comando RewriteBase que indica la carpeta base a donde se aplicará la reescritura.

  1. Options +Indexes
  2. Options +FollowSymlinks
  3. RewriteEngine on
  4. RewriteBase /rewrite/
  5. RewriteRule ^(.*)/(.*)/ products.php?cat=$1&subcat=$2

Luego si creamos un PHP que imprima las variables que se les pasa por URL, tendríamos el siguiente código de ejemplo.

  1. <?php
  2. // file: products.php
  3. echo "<b>Categoría: </b>\t" . $_GET["cat"] . "<br>";
  4. echo "<b>SubCategoría</b>\t: " . $_GET["subcat"] . "<br>";
  5. ?>

Finalmente podemos ver que podemos obtener el mismo resultado al acceder a las siguientes URLs, las cuales devuelven el mismo resultado, pero obviamente la segunda forma es mucho mas corta y mas fácil de recordar.
http://samples.unijimpe.net/rewrite/products.php?cat=monitor&subcat=LCD
http://samples.unijimpe.net/rewrite/monitor/LCD/

Si desean mas información pueden leer mod_rewrite en la documentación oficial de Apache en donde encontrarán una guía muy detallada de como crear y utilizar reglas para las URLs. Finalmente para los interesados les dejo los archivo fuente de este ejemplo.

Comentarios Total 26 comentarios


Curro
Publicado: 23/01/2008 6:39 am

Muy bueno el tuto, funciona muy bien en mi caso, pero aun tengo un problema:

¿Que sucede si ademas de mostrar la categoria y la subcategoria, en mi web quisiera mostrar solo categoría?. Es decir:

ademas de redireccionar http://www.sample.com/producto.php?cat=monitor&subcat=lcd
quisiera redireccionar tambien
http://www.sample.com/producto.php?cat=monitor

Supongo que sería con:
RewriteRule ^(.*)/ products.php?cat=$1

Pero las dos RewriteRule juntas no me funcionan, por separado si, pero si deseo una de las dos dependiendo de la dirección con la que entre, no me funciona bien y coge la que no es. ¿Como se haría?

Mark
Publicado: 28/02/2008 11:58 pm

Excelente!

Que podria estar pasando si no me funciona haciendolo justo como éste ejemplo, de hecho me muestra el mensaje de “Not Found”

Gracias!

Alquiberia
Publicado: 01/05/2008 12:50 pm

Muy buenas. Tengo una pequeña duda.
Tengo implementado el mod_rewrite en mi web:
http://www.alquiberia.es
Pero tengo un problema cuando supero las 10 variables. Todo funciona perfectamente mientras no supere las 10 variables.
Por ejemplo:
Rewriterule ^([^/]+)-([^/]+)/([^/]+)-([^/]+)/([^/]+)-([^/]+)/([^/]+)-([^/]+)\.html$ index.php?$1=$2&$3=$4&$5=$6&$7=$8 [NC,L]

Funciona perfectamente pero si supero las 9 variables falla y mezcla el valor de las variables.

Alguna sugerencia???

Gracias


[...] ZonaPHP, BaluArt, Unijimpe     Read More    Post a [...]

Eddy Luque
Publicado: 27/10/2008 10:50 am

El codigo esta bien .. pero un pregunta .
tengo una site y es administrable .. y ahora que me doy cuenta que en el inicio de logeo del admin los estilos no los reconoce y la parte administrativa se han perdido los estilos…
y al eliminar el htaccess se arregla todo (en el admin) … a que se debe esto …

unijimpe
Publicado: 27/10/2008 10:14 pm

El problema es que la poner el MOD_REWRITE las rutas que utilizas para llamar a los JS o CSS no se reconocen correctamente, para ello debes poner la ruta absoluta de los css y no rutas relativas, es decir en lugar de usar:

<link rel="stylesheet" type="text/css" href="css/styles.css" />

Debes utilizar:

<link rel="stylesheet" type="text/css" href="/admin/css/styles.css" />

Manuel
Publicado: 29/10/2008 4:20 am

Hola,
Fantásticas las explicaciones, pero no consigo solucionar un problema. A ver si algún experto en modrewrite me puede ayudar.

Tengo indexadas en google muchas páginas con las url de esta forma:

http://www.mipagina.com/?num=452&cla=Negocio

el problema es que si alguien entra desde Google con una de estas url obtiene un “página no encontrada”. Pues ahora el formato ha cambiado a:

http://www.mipagina.com/?num=452&cla=business

¿Cómo puedo hacer que los que entran con la primera URL sean redirigidos a la nueva URL?

¡Gracias a quien me ayude!

Jose
Publicado: 08/11/2008 12:59 am

Creo que este link te debe funcionar…
http://www.webtutoriales.com/tutoriales/mantenimiento/301-redirect.6.html

Fijate en el redirect 301…

Matias
Publicado: 15/11/2008 11:49 pm

HOla genial todo me saco muchas dudas, y si me abrio la mente con este tutto, gracias

fredy
Publicado: 22/12/2008 2:45 am

Holas amigo de inijimpe espero que al leer este mensajito me puedas ayudar mira lei uno de tus post sobre mod_rewrite pero tngo el problema q mi swf no reproduce cuando uso el mod_rewrite:
la ide original es esta:
http://dedicatusvideos.com/videopostales/videopostal.php?idenvio=9644jYF_rXpxsd4311&depara=fredy-para-lenin

donde me funcioan a la perfeccion mi archivo swf pero esto pongo en el .htaccess
Options +Indexes
Options +FollowSymlinks
RewriteEngine on
RewriteBase /videopostales/
RewriteRule ^(.*)/(.*)\.html$ videopostal.php?idenvio=$1&depara=$2

tambien lo puse asi pero sige igual:
Options +Indexes
Options +FollowSymlinks
RewriteEngine on
RewriteBase /videopostales/
RewriteRule ^(.*)/(.*).html videopostal.php?idenvio=$1&depara=$2

y muestro esto pero aqui no reproduce mi swf no se por que o a que se debe:
http://dedicatusvideos.com/9644jYF_rXpxsd4311/fredy-para-lenin.html

unijimpe
Publicado: 22/12/2008 9:13 am

Hola, el problema es que al hacer uso el MOD_REWRITE los elementos como imagenes y SWFs deben colocarse con rutas absolutas para que puedan mostrarse correctamente. En el ejemplo que me envias has puesto como ruta del SWF:
< param name="movie" value="postalnavidad.swf" />

Entonces lo que debes hacer es reemplazarlo por:

< param name="movie" value="/postalnavidad.swf" />

fredy
Publicado: 22/12/2008 3:18 pm

nada amigo unijimpe ya no se que hacer puse como dijiste “/postalnavidad.swf” tambien “/../videospostales/postalnavidad.swf” asta puse la ruta completa “http://dedicatusvideos.com/videopostales/postalnavidad.swf” y nada no reproduce mi elemento SWF

unijimpe
Publicado: 22/12/2008 4:52 pm

Además de colocar la ruta completa al SWF, debes hacer que las rutas a las que llama el SWF, por ejemplo imágenes o vídeos también sean rutas absolutas.

fredy
Publicado: 22/12/2008 6:22 pm

¿pero es por eso q no me muestra mi swf? por que en ese swf no jala otro video o imagen esta empaquetado en uno solo…

Eddy Luque
Publicado: 14/01/2009 1:49 pm

Gracias por la explicación.
Ahora mi inquietud es lo siguiente:
estoy realizando un clasificado, como haria para poder identificar el pais del usuario y de esta manera poner un subdominio con el pais del visitante + el dominio : peru.clasificados.com.
Hay alguna clase o funcion que pueda usarse .
Gracias de antemano.
Espero que puedan ayudarme.

JavierStudio.net
Publicado: 18/01/2009 1:50 am

soy un programador en php, mi nombre es Javier Urbina, realmente muchas gracias es un simple ejemplo pero con eso me abriste las puertas a todo un nuevo mundo , nunca pense que fueran tan sencillo estuve buscando en internet otros tutoriales sobre esto pero no habia entontrado uno tan sencillo y a las vez ilustrativo , muchas gracias! super secilla la logica , sigue asi !

Gustavo
Publicado: 13/02/2009 8:15 am

Hola tengo el siguiente problema
En mi pagina los usuarios tienen su propio directorio asi

http://www.pagina.com/usuario
http://www.pagina.com/juancho

El problema que como linux es key sensitive si escriben mal, por ejemplo:
http://www.pagina.com/Juancho
http://www.pagina.com/JuAnChO

No llegan nunca a mi pagina como lo resuelvo con mod_rewrite, Gracias

julio
Publicado: 17/02/2009 9:36 am

hola, la verdad que no logro hacer andar esto en mi localhost, primero que nada necesito saber donde pongo el htacces ya que lei por todos lados y en todos veo cosas diferentes, mi ruta en local es esta http://localhost/proyectos/autos-alquiler/src/home/ y ahi es donde levanto mediante base de datos los valores que muestro, al quedar en pantalla el vinculo me queda asi “http://localhost/proyectos/autos-alquiler/src/home/1/economicos/374/1.html”.Ahora cuando hago el .htaccess escribo las lineas siguiente:
RewriteEngine On
RewriteBase /proyectos/autos-alquiler/src/home/
RewriteRule ^(.*+)/(.*+)/(.*+)/(.*+)\.html$ /categorias/categorias.php?idm=$1&ref=$2&icat=$3&categoria=$4 [L,NC] ”
ya sea le ponga el archivo categoría en la msima carpeta que el index o en otra no funciona, siempre el mismo, not found.

Alguien puede guiarme a lo que estoy haciendo mal, muchas gracias

Amb
Publicado: 01/07/2009 7:25 pm

Mayormente hay errores con el mod_rewrite en local host, instale varios paquetes comoe easyphp pero no me funcionaba bien el mod_rewrite
con el xampp no tube ningun problema y acerca de el .htaccess eso se puede poner en todas las carpetas raiz de tus paginas webs

MIguel
Publicado: 02/09/2009 6:34 am

hola Unijimpe, digamos q yo necesito oviar el .php de un url ejm:

http://www.misitio.com/ver.php?v=123

y quiero eliminar el .php y se vea asi:

http://www.misitio.com/ver?v=123

se puede hacer con rewrite? como? please!

Eddy Luque
Publicado: 16/10/2009 11:43 am

Que tal Gustavo , para evitar eso debes convertir todo a minuscula ,
Otra cosa si usas URL AMIGABLES : Por ejemplo : tienes algo asi : “Prueba de url Amigable 2009″ y quieres pasar todo eso como URL AMIGABLE => prueba-de-url-amigables-2009 puedes usar mi funcion …

Aqui te va :
function safename($title){
// reemplazamos todos los caracteres no deseados de una cadena por “-” ;
$title = str_replace(“&”, “and”, $title);
$arrStupid = array(‘feat.’, ‘feat’, ‘.com’, ‘(tm)’, ‘ ‘, ‘*’, “‘s”, ‘”‘, “,”, “:”, “;”, “@”, “#”, “(“, “)”, “?”, “!”, “_”,
“$”,”+”, “=”, “|”, “‘”, ‘/’, “~”, “`s”, “`”, “\\”, “^”, “[","]“,”{“, “}”, “”, “%”, “™”);

$title = htmlentities($title);
$title = preg_replace(‘/&([a-zA-Z])(.*?);/’,'$1′,$title); // get rid of bogus characters
$title = strtolower(“$title”);
$title = str_replace(“.”, “”, $title);
$title = str_replace($arrStupid, “-”, $title);
$flag = 1;
while($flag){
$newtitle = str_replace(“–”,”-”,$title);
if($title != $newtitle) {
$flag = 1;
}
else $flag = 0;
$title = $newtitle;
}
$len = strlen($title);
if($title[$len-1] == “-”) {
$title = substr($title, 0, $len-1);
}
return $title;
}

Carlos Lopez
Publicado: 08/12/2009 11:55 am

Buenas tardes amigo, Mi problema consiste en redireccionar una aplicación de mi red interna al servidor Web para q esta pueda salir por Internet. Cunado lo intento y me conecto desde otra PC no me reconoce la ip de mi red interna. Como puedo hacer para que la herramienta mod_rewrite cuando un usuario haga una petición por Internet me redireccione al sistema q esta en mi red interna.

Espero su grata respuesta…

Nicolas
Publicado: 20/12/2009 4:41 pm

Hola master!! Me has re ayudado. Mi cuestion era que queria instalar el framework symfony en un directorio compartido, y resulta que como no puedo configurar los virtual host, quedaba la carpeta publica junto con las otras.De esa forma, las url no andaban para nada. Lo soluciones cambiando el rewriteBase a /web.

Grande unijimpe!!

FEDERICO
Publicado: 22/12/2009 3:22 pm

Hola!!
Realmente me ha sido de mucha ayuda
pero mi problema es que tengo que usar el mod en el directorio principal entonces utilizo una variable y si es
RewriteRule ^(.*)$indexx.php?id=$1
El tema es que de este modo si yo entro directo al domino sin mas… (midominio.com) me tira error 404.. lo que es evidente…
pero la regunta es que rule tengo que usar para detectar que no hay variables y mandarlo a index.php

MUCHAS GRACIASSS

Andy
Publicado: 21/04/2010 4:38 am

hey hey no es necesario poner las rutas absolutas basta solo poner este codigos en

y listo perrin asi no pierden las rutas de imagenes etc.

Edison
Publicado: 18/06/2010 10:55 am

hola me parece muy interesante las indicaciones, me han servido un monton.
Tengo un peque problema. Al acceder a una pagina a través de una url amigable, se mantiene la ruta anterior y cuando quiero ir a otra direccion no la encuentra. ejemplo:

estoy en una pagina index cuya direccion a clientes es: clientes/id,juan/area,contabilidad/ ; y funciona correcto llevandome a clientes pero si quiero regresar a index tengo algo asi: index/v,0/n,0/ ; pero en realidad me conduce a: clientes/id,juan/area,contabilidad/index_amigable/v,0/n,0/, es decir mantiene la direccion anterior.

soy nuevo en esto, les agradezco su ayuda

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)