Ir al contenido principal

Módulo mod_rewrite de Apache (urls amigables)

Este módulo de apache nos permite la reescritura de URLs, proporciona una manera flexible y potente para manipular las URL utilizando un número ilimitado de reglas.

Cada regla puede tener un número ilimitado de condiciones de la regla adjunta, para que pueda volver a escribir la URL en base a variables de servidor, variables de entorno, las cabeceras HTTP, o marcas de tiempo.

Estas reglas se pueden invocar en el archivo httpd.conf o en los .htaccess de cada carpeta.

Instalando y habilitando mod_rewrite 

En el archivo de configuración de apache httpd.conf en mi caso C:\wamp\bin\apache\apache2.4.9\conf\httpd.conf buscar la línea que dice:

#LoadModule rewrite_module modules/mod_rewrite.so

Y quitar el # para que esa línea ya no sea tomada como comentario y así ya cargara el modulo.

Por ultimo nos queda hacer que apache busque los archivos .htaccess en cada directorio de tu servidor, para esto buscamos en el archivo httpd.conf lo siguiente:
<Directory "c:/wamp/www/">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   AllowOverride FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #

#   onlineoffline tag - don't remove
    Require local
</Directory>

Y cambiamos la parte que dice AllowOverride None con AllowOverride All, me queda asi:

<Directory "c:/wamp/www/">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   AllowOverride FileInfo AuthConfig Limit
    #
    AllowOverride All

    #
    # Controls who can get stuff from this server.
    #

#   onlineoffline tag - don't remove
    Require local
</Directory>

Reiniciamos apache y listo.

Entendiendo RewriteRule

Esta directiva define las reglas de rescritura.

La sintaxis es:
RewriteRule url_patron url_destino [banderas]

Donde las banderas pueden ser y pueden ir entre comas:
END: detiene la rescritura y no se aplican más reglas, ni en los .htaccess de los subdirectorios.
L: detiene la rescritura y no se aplican más reglas en su propio contexto.
NC: no importa las mayúsculas y minúsculas en la comparación.
QSA: añade cadenas de consulta de url_patron a url_destino.
R: obliga a la redirección externa.

Ejemplo 1:

RewriteRule ^(.+)$ index.php?categoria=$1 [L]

El patrón es ^(.+)$, y significa cualquier cadena.

Si la petición es www.kintucms.org/monitor nuestra url_destino es www.kintucms.org/index.php?categoria=monitor

Ejemplo 2:

RewriteRule ^(.+)$ index.php?categoria=$1 [QSA,L]

El patrón es ^(.+)$, y significa cualquier cadena.

Si la petición es www.kintucms.org/monitor?pagina=1 nuestra url_destino es www.kintucms.org/index.php?categoria=monitor&pagina=1

Entendiendo RewriteCond

Esta directiva nos permite especificar una condición que si se cumple se ejecuta la directiva RewriteRule posterior. Se pueden poner varias condiciones con RewriteCond, en este caso cuando se cumplen todas se ejecuta la directiva RewriteRule posterior.

La sintaxis es:

RewriteCond texto_a_evaluar patrón_evaluador

Ejemplo 1:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^.+$ error.html [QSA,L]

Si la url al que quieren acceder no es un directorio (línea 2), y no es un archivo (línea 3) y no es un acceso directo (línea 4); le decimos que cargue la página error.html (línea 5), con banderas QSA (mantiene las cadenas de consulta) y L (detiene rescritura).

Ejemplo 2: tenemos la siguiente página que hace las operaciones de acuerdo a los parámetros enviados http://localhost/operar.php?operacion=suma&operadorx=5&operadory=7, esta url larga y compleja lo podemos cambiar por http://localhost/operar/suma/5/7 con lo siguiente:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^operar/(.+)/(.+)/(.+)$ operar.php?operacion=$1&operadorx=$2&operadory=$3 [QSA,L]

En la directiva RewriteRule, establecemos que toda petición que inicia con operar/; luego ponemos un grupo (.+), que significa cualquier juego de caracteres; seguido de un /; luego tenemos otro grupo idéntica al anterior; seguido de un /; luego tenemos el último grupo idénticos a los anteriores. En el url_destino ponemos el archivo operar.php, seguida de los parámetros que este archivo necesita, $1 significa el texto del primer grupo de nuestra expresión, $2 el segundo grupo y $3 el tercer grupo.

Con esta configuración si ejecutamos operar/suma/10/5 internamente se estará ejecutando operar.php?operacion=suma&operadorx=10&operadory=5

Ejemplo 3:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^.*/publico/.*$
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule (.+) $1 [QSA,END]
RewriteCond %{REQUEST_URI} ^.*/admin/.*$
RewriteRule ^admin/(.*)$ app/index.php?url=$1 [QSA,END]
RewriteRule (.+) index.php?url=$1 [QSA,END]

La primera rescritura tiene dos condiciones, la primera es que la url solicitada tiene que contener en alguna parte /publico/, la segunda es que la misma url solicitada tiene que ser un archivo existente; si estas dos condiciones son verdaderas se hace la rescritura, en realidad ninguna rescritura, con END indicamos que no se harán ninguna rescritura en adelante, con esta regla estoy permitiendo todas las peticiones a archivos existentes de la carpeta público del servidor.

La segunda rescritura tiene una condición, que la url solicitada tenga los caracteres /admin/, si esto se cumple hacemos la rescritura a otra dirección, con esta regla todas la peticiones a admin, en realidad se ejecute un archivo app/index.php.

La tercera rescritura no tiene condiciones, con esta regla todas las peticiones lo redirijo al archivo index.php, pasando como parámetro la variable url, que equivale a la petición.

De todas estas rescrituras solo se ejecutara una en cada petición,  con estas reglas protejo todos los archivos de mi servidor, redirigiendo al archivo index.php, excepto los archivos de la carpeta público,  también que en las peticiones a admin se sirva app/index.php.

Para entender todo esto mostraré la estructura de directorios y archivos:

-index.php
-app/
 -index.php
-publico/
 -foto.jpg


Qué pasa si accedemos a http://localhost/publico/foto.jpg, esta url contiene /publico/, y además es un archivo y existe, por lo cual se hace la primera rescritura, y se sirve al archivo sin ningún problema.

Qué pasa si accedemos a http://localhost/publico/inexistente.jpg, esta url contiene /publico/, pero este archivo no existe, por lo cual la primera rescritura queda sin efecto; esta url no contiene /admin/, por lo cual la segunda rescritura queda sin efecto; la tercera rescritura no tiene ninguna condición así que esta se aplicara, así pues internamente se ejecutara http://localhost/index.php?url=publico/inexistente.jpg.

Qué pasa si accedemos a http://localhost/app/, solo se aplica la tercera rescritura e internamente se ejecutara http://localhost/index.php?url=app/.

Qué pasa si accedemos a http://localhost/admin/, la primera y tercera rescritura queda sin efecto, la segunda rescritura se aplica e internamente se ejecuta http://localhost/app/index.php.

Qué pasa si accedemos a http://localhost/admin/hola/,  la primera y tercera rescritura queda sin efecto, la segunda rescritura se aplica e internamente se ejecuta http://localhost/app/index.php?url=hola/.

Y taran esto es todo, espero que les ayude en algo.



Comentarios

  1. The 14 best casinos with slot machines in Vegas
    The 15 best casinos with slot machines in Vegas · 제주 출장안마 Hollywood Casino at Charles Town 의왕 출장마사지 Races 강릉 출장샵 · 시흥 출장안마 Hollywood Casino at Montbleu Casino Resort · The Buffington 남원 출장안마 Casino at

    ResponderBorrar

Publicar un comentario

Entradas más populares de este blog

Acceder a wamp/xampp desde otro pc

En ocasiones queremos que nuestros proyectos web que están en un servidor web local ( http://localhost/ ), sean accedidos desde otras computadoras de la red a través de la IP del servidor web local. Pero esto no es posible debido a que algunas soluciones que integran apacahe - php - mysql - otros en un solo paquete (Wampserver, xampp) solo habilitan el acceso de manera local. La solución está en editar (cambiar directivas) el archivo de configuración del apache, en este caso trabajare con Wamp. Cambiando directivas en Directory Abrir el archivo de configuración de apache, en mi caso: C:\wamp\bin\apache\apache2.4.9\conf\httpd.conf Y buscar: <Directory />  AllowOverride none  Require all denied </Directory> Y modificar a esto: <Directory /> AllowOverride none #Require all denied Order allow,deny Allow from all </Directory> Cambiando directivas en el documentRoot En el mismo archivo buscar: <Directory "c:/wamp/...

Instalar varias versiones de Mozilla Firefox en Windows

A veces tenemos la necesidad de probar nuestras aplicaciones web en diferentes navegadores y en sus diferentes versiones, en el caso de Firefox no se puede tener varias versiones instaladas al mismo tiempo, por más que se hagas instalaciones personalizadas eligiendo otra carpeta de destino. Una posible solución es instalar las versiones portables, funciona pero no he quedado conforme, la otra solución es la que detallo continuación. Crearemos un perfil de ejecución para cada versión de Firefox, y haremos instalaciones personalizadas para cada versión. Creando un nuevo perfil Presionamos tecla Windows + R (ventana ejecutar) y escribir: firefox –profilemanager Se abrirá la siguiente ventana, en tu caso solo aparecerá “default” a mi aparece varios porque tengo todas esas ya instaladas. Creamos un nuevo perfil (crear perfil) Poner el nombre de perfil, yo le pongo ff3 porque será firefox 3.0. Ahora ya tengo el perfil ff3 agregado, luego salir ...

Modelo de datos para una encuesta

Modelo de datos para encuesta, la aplicación lo hice con codeigniter, espero subirlo pronto.