En esta tercera entrega de tips para el htaccess voy a mostrar como obtener urls amigables en un subdirectorio de nuestra web, como redirigir las peticiones a cierto tipo de archivos y como redirigir de un subdirectorio al raiz de otro dominio utilizando RewriteRule, Redirect y RedirectMatch.

Como ya había mencionado, las url amigables son más fáciles de recordar y mejoran la usabilidad y el posicionamiento en los buscadores.

En este artículo mostraré como proteger los archivos de nuestra aplicacion de ser llamados por fuera de la ruta preestablecida, como redireccionar de un subdirectorio a otro dominio, de un directorio a un subdirectorio y viceversa.

Al utilizar urls amigables nos encontramos con que en nuestra estructura de directorios cuando un archivo existe lo muestra, y cuando no, redirige a nuestro index.php. Esto hace que debamos pensar dos veces los nombres de nuestros archivos y carpetas para que no ocasionen problemas con el funcionamiento del sitio.

Existen dos formas de solucionar esto, una es redirigiendo todas las peticiones a esas rutas, exista contenido en ellas o no. La otra forma es filtrando por tipo de archivo, ya que uno de nuestros problemas es que no queremos que accedan directamente a nuestros archivos php en la ruta de aplicación.

El siguiente código permite las urls amigables para el subdirectorio /mi_aplicacion en nuestro dominio:

Options +FollowSymlinks

RewriteEngine on
RewriteBase /mi_aplicacion
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /mi_aplicacion/index.php?route=$1 [L]

En este caso si solicitamos www.miweb.com/mi_aplicacion/app/index.php y no existe se ejecutará la accion a través de la url amigable, pero en caso que exista intentará ejecutarlo.

Para solucionar esto tenemos dos opciones, la primera es redirigir todas las peticiones a esa ruta haciendo uso de Redirect:

Redirect /mi_aplicacion/app/ /mi_aplicacion/error/url/$1
Redirect /mi_aplicacion/lib/ /mi_aplicacion/error/url/$1

Estas lineas redirigen todas las peticiones de archivos o carpetas de las rutas app y lib en nuestra aplicación al index principal, esto soluciona el problema de verificar en cada archivo si está siendo llamado por el router de la aplicación o directamente por la ruta, pero si tenemos un css, js u otro archivo para ser enlazado tambien será redirigido.

La otra manera es redirigir por tipo de archivo, de esta manera podemos proteger solo nuestros archivos php en esas rutas y permitir que otros archivos sean enlazados haciendo uso de RedirectMatch:

RedirectMatch 301 app/(.*)\.php /mi_aplicacion/error/url/hack
RedirectMatch 301 lib/(.*)\.php /mi_aplicacion/error/url/hack

Esto redirigirá todas las solicitudes de archivos php en los directorios app y lib y todos sus subdirectorios, pero mostrará otros archivos si existen.

Nuestro archivo .htaccess debería haber quedado así:

Options +FollowSymlinks

RewriteEngine on
RewriteBase /mi_aplicacion
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /mi_aplicacion/index.php?route=$1 [L]

RedirectMatch 301 app/(.*)\.php /mi_aplicacion/error/url/hack
RedirectMatch 301 lib/(.*)\.php /mi_aplicacion/error/url/hack

Esto permitirá acceder por ejemplo a:
www.miweb.com/mi_aplicacion/app/main.css mientras que redirigirá
www.miweb.com/mi_aplicacion/app/test.php a www.miweb.com/mi_aplicacion/index.php
Para proteger otras extensiones solo basta con agregarlas a los RedirectMatch

Y como bonus voy a dejar algunos ejemplos más de redirecciones:
De un subdirectorio a otro dominio(htaccess en dominio viejo):

RedirectMatch 301 ^(.*)$ http://www.nuevositio.com$1

Supongamos un visitante accede a www.miweb.com/test/loquesea, esta linea redirige a www.nuevositio.com/test/loquesea, si en el nuevo dominio el contenido “loquesea” se encuentra en el raiz, www.nuevositio.com/loquesea, podemos solucionarlo el error de la ruta con(htaccess en dominio nuevo):

RedirectMatch 301 ^/test/(.*)?$ http://www.nuevositio.com/$1

Esta linea soluciona el problema de ruta generado por la redirección desde nuestro anterior dominio.

Si por el contrario necesitamos mover todo a un subdirectorio podemos utilizar:

RedirectMatch 301 ^/test/(.*)?$ http://www.miweb.com/otro/test/$1

Esta linea redirecciona todas las solicitudes a la carpeta:
www.miweb.com/test/lo_que_sea a www.miweb.com/otro/test/lo_que_sea

Estas simples modificaciones nos permiten mejorar la seguridad y sencillez de nuestras aplicaciones ya que forzosamente todo debe pasar por el index.php principal y facilita no tener que idear un sistema de redirección basado en php e implementarlo en cada archivo.
 


 

3 Comentarios para “URLs semánticas con Apache y PHP III + Redirect”

  1. Lucas Says:

    Gran tutorial. Va a mis bookmarks ;-)

  2. AnimacionyWeb » » URLs semánticas con Apache y PHP II Says:

    [...] a un archivo de error pre-diseñado.   EDIT: Hay un nuevo artículo con varios cambios URLs semánticas con Apache y PHP III + Redirect [...]

  3. AnimacionyWeb » » URLs semánticas con Apache y PHP Says:

    [...] servidor web. EDIT: Hay nuevos artículos con varios cambios: URLs semánticas con Apache y PHP IIURLs semánticas con Apache y PHP III + Redirect [...]

Deja un comentario

Desarrollado por AnimacionyWeb     Stats