Doymer Consultores

  • Increase font size
  • Default font size
  • Decrease font size
Inicio Blog Joomla! htaccess con Joomla en Windows
19
Oct
2010

htaccess con Joomla en Windows

Imprimir PDF

Es bien sabido que, para protegerse frente a ciertos ataques básicos, en muchos sitios de internet se recomienda el uso del fichero .htaccess. Sin embargo este fichero sólo sirve si nuestro servidor está basado en Apache y muchos tienen (tenemos) servidores windows aunque no la versión IIS7. ¿Significa esto que tenemos que renunciar a este filtro de entrada? La respuesta es que no y en este artículo intentaremos ofrecer algunas alternativas.

Para aquellos que sirven páginas desde IIS existen otras alternativas como UrlRemap del kit de recursos de IIS6, IISRewrite, UrlRewriting.Net, IIS7 RewriteModule, etc. pero cada una de ellas tiene algún pero. Bien necesitas el entorno .Net y todas las peticiones pasan por ese entorno reduciendo el rendimiento del sitio, o no permiten expresiones regulares en las cadenas de selección o requieren de IIS7.

Explorando otras opciones

Afortunadamente, la lista de opciones disponibles incluye IIRFextlink, un filtro de reescritura para IIS gratuito (donationware) y de código abierto que permite el uso de expresiones regulares e incluye bastantes funcionalidades. Como característica interesante está el hecho de que una única copia del programa permite gestionar diferentes filtros para diferentes sitios en caso de que tengamos más de un sitio alojado en nuestro servidor lo que lo hace muy eficiente. Y finalmente su autor, Cheeso, revisa de forma bastante activa el foro del producto y es una persona bastante abierta y colaborativa por lo que, aunque gratuito, el soporte que ofrece es increíblemente bueno.

No voy a detenerme en este artículo en los pormenores de descarga e instalación de IIRF ya que las instrucciones están perfectamente claras en la página de ayuda del producto que podeis encontrar aquíextlink y, en este artículo, me dedicaré a contar un poco cómo podemos usarlo para proteger en cierta medida nuestra página de Joomla y cómo mejorar o reparar problemas de SEF. Joomla ya incluye un fichero htaccess y lo utilizaremos como base para generar el nuestro.

Tal y como se indica en la documentación de IIRF necesitamos crear un fichero iirf.ini en la raíz del directorio del sitio en el que queramos activar el servicio. Como hemos dicho antes copiaremos el fichero htaccess de joomla y lo usaremos como base.

Lo primero que hacemos es verificar algunos parámetros generales como que el motor de reescritura está activo. Incluye las siguientes líneas si no aparecen:

RewriteEngine On
#RewriteLog c:\logs\iirf
RewriteLogLevel 3

La primera línea activa el motor de rescritura. La segunda línea (comentada en el caso anterior) activa la escritura de un fichero de registro  donde se van grabando las acciones que se realizan según nuestras reglas. Es interesante activarla mientras ponemos en marcha el servicio y siempre que hagamos cambios para certificar que el filtro está activo y que las reglas se están procesando tal y como nos interesa y luego desactivarlo para evitar llenar el disco con algo que pocas veces vamos a mirar.

La tercera línea indica la cantidad de información que deseamos volcar en este fichero de registro cada vez que alguien solicite una página del sitio y el valor mostrado es un buen punto de partida para saber si lo estamos haciendo bien o no.

 

A continuación nos encontramos en el fichero htaccess original con dos secciones, una de bloqueo de ataques conocidos y otra de SEF. La primera está perfectamente bien como está y IIRF no tiene problemas para entender y procesar su contenido. Sin embargo en la sección de SEF tenemos que hacer algunos cambios. La sección tal y como aparece en htaccess es la siguiente:

########## Begin - Joomla! core SEF Section
#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
RewriteRule (.*) index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
#
########## End - Joomla! core SEF Section

Un poblema con estas lineas es que IIRF no tiene todavía implementado el modificador E por lo que la línea

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

no es válida. Así que hemos de eliminarla por lo que debemos arrastart a la línea anterior el modificador [L] que indica que es la última de se ha de ejecutar de ese bloque.

El problema de eliminar esta última línea aparece si tenemos el PHP instalado en modo CGI y no como módulo. El objetivo de esta línea es asignar a la variable de entorno HTTP_AUTHORIZATION el par usuario/contraseña y permite que el mecanismo de autorización de PHP funcione también cuando está instaldo en modo CGI al recoger posteriormente estos valores desde el entorno y esto es algo que perdemos si usamos este programa, al menos, hasta que su creador incluya soporte para el modificador E. Así que, si vuestro PHP se ejecuta en modo CGI tendréis que reinstalarlo como módulo para poder utilizar IIRF sin perder la autentificación.

Tras aplicar este cambio la sección queda asi:

########## Begin - Joomla! core SEF Section
#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
RewriteRule (.*) index.php [L]
#
########## End - Joomla! core SEF Section

Otras cosas que podemos hacer

Si hemos activado la opción de generar URL que sean amigables a los motores de búsqueda, la conocida como SEF, entonces nuestros URLs serán de la forma /component/10/003/mi-articulo o similar. Estos URLs son los preferidos por los motores de búsqueda y ayudan a posicionar mejor nuestrás páginas. Pero tienen el problema de impedir la reorganización del sitio. Una vez que los han asociado a una página si reorganizamos el sitio apuntarán a páginas desconocidas con lo que lo que antes era una mejora de posicionamiento se convierte ahora en lo contrario.

En nuestro caso una de estas referencias apuntaba erróneamente a /blog/es/blog/joomla/articulo cuando el correcto era /es/blog/joomla/articulo. Este problema se produjo al incorporar idiomas al sitio despues de que éste hubiese estado funcionando algún tiempo, algo que como se puede ver es bastante posible. Usando la capacidad de reescritura de IIRF y los datos de página no encontrada que nos ofrecen los programas de estadística de acceso al sitio, podemos corregir estos problemas. Así si nuestros URLs ahora comienzan por /es o por /en (o cualquier otra cosa) y no por /blog podemos usar la siguiente línea para corregirlo

# Capturar las peticiones que comiencen con /blog/ y eliminarlo
RewriteRule ^/blog/(.*)$ /$1 [NC]

Hay que tener cuidado con la regla que se use o eliminaremos tambien el /blog que hay detrás del indicador de idioma. Para evitar eso anclamos el patrón de búsqueda al principio de la frase mediante el indicador de inicio ^. Así sólo lo que empiece por /blog/ será eliminado. Eso quiere decir que la llamada sitio.com/blog no se verá afectada por esta regla aunque si sitio.com/blog/

Podemos continuar adaptando las URLs al formato de nuestro sitio pero debemos tener en cuenta el funcionamiento recursivo de mod_rewrite que IIRF también utiliza; así cada vez que una regla encuentra una coincidencia y se realiza una sustitución se restituye el puntero y el sistema comienza de nuevo por la primera regla con los datos que acaban de cambiar. Sin embargo el cambio no se traslada a las variables globales del sistema en cada bucle, sino sólo al final para mejorar el rendimiento. Así que los cambios existen sólo en la variable interna referenciada mediante la macro $0. Por tanto verificar ahora si nuestra URI incluye index.php mediante la llamada incluida en el fichero original htaccess

RewriteCond %{REQUEST_URI} !^/index.php

no funciona ya que REQUEST_URI sigue conteniendo la URI original no modificada por la regla ya ejecutada. Sin embargo la solución está sólo a un paso ya que si usamos $0 en lugar de %{REQUEST_URI} estaremos recogiendo los cambios realizados en bucles anteriores y todo funcionará como deseamos. Si aplicamos esto a nuestro juego de reglas nos quedaría algo como esto:

# Capturar las peticiones que no comiencen con index.php como /es/blog/joomla/articulo
# y añadirles el /index.php necesario para que nuestro router funcione como es debido
# Ignorar los directorios de servicio como plugins, images, templates, components, etc.
RewriteCond $0 !^/plugins/
RewriteCond $0 !^/images/
RewriteCond $0 !^/media/
RewriteCond $0 !^/includes/
RewriteCond $0 !^/templates/
RewriteCond $0 !^/components/
RewriteCond $0 !^/modules/
RewriteCond $0 !^/administrator/
RewriteCond $0 !^/index.php
RewriteRule ^(.*) /index.php$1
# Capturar los URLs erróneos (directorios, ficheros inexistentes, etc) y redirigirlos home
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $0 !^/index.php
RewriteCond $0 (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
RewriteRule (.*) index.php [L]

Recuerda, si escribes bloques de reglas abiertos, es decir que no contienen el modificador L en la regla de reescritura, tienes que tener cuidado de utilizar el dato deseado como valor de entrada o entrarás en un bucle. Por defecto, y para evitar bloquear al sistema, este bucle está limitado a 8 pasadas pero el resultado que obtendrás no será el deseado.

Y si existen dudas sobre qué reglas son las correctas lo primero que hay que hacer es ir a la documentación y leer detenidamente lo que allí pone. Hay mucha información condensada y la lectura debe ser lo más detallada posible porque hay cosas que no se ven con facilidad a primera vista. También se pueden leer las solicitudes efectuadas por otros usuarios en el foro de soporte y, en última instancia, efectuar una petición de ayuda. Pero no hagáis esto antes de leeros el manual o Cheeso se enfadará (y con razón).

Share
Última actualización el Martes 19 de Octubre de 2010 15:54  

Comentarios  

 
0 # click aqui 22-02-2017 12:32
 Un videogame de consolas con fantasticas modos de videojuego, de todas
formas poco sofisticadas

Hecha un ojo y puedes visita mi web blog... click aqui: http://www.rescreatu.com/exit.php?p=http://Www.Trucoteca.com
Responder | Responder con una citación | Citar
 

Escribir un comentario

El propietario de esta página no se hace responsable de las opiniones de sus lectores en los comentarios, así como puede o no estar de acuerdo con lo que en ellos se diga.

Usa el juego limpio en tus comentarios

Por favor, no realices comentarios ofensivos o insultantes. Tampoco generes comentarios con publicidad o Spam. No utilices los comentarios para 'enchufar' tu sitio. Los enlaces que pongas podrán ser eliminados. Pretendemos crear un espacio de comunicación entre el autor y los lectores.

Todos agradeceremos el correcto uso de la ortografía, pues no todos somos capaces de entender mensajes 'codificados' tipo SMS. Además te rogamos uses signos de puntuación, si puede ser, para mejorar la comprensión de tu mensaje.
No escribas sólo en mayúsculas ya que en Internet escribir con mayúsculas equivale a GRITAR y no por gritar se te va a hacer más caso sino, probablemente, al contrario.

Reserva de Edición

Nos reservamos el derecho de no incluir comentarios que sean ofensivos, desagradables, que ataquen a terceros (racistas, homófobos, etc) o que no tengan que ver con el sitio o con el tema de que se trata.
Los datos suministrados al emitir tu comentario son privados y de tu propiedad y no serán usados para ningúna acción comercial ni de otro tipo.


Código de seguridad
Refescar


Archivo

Powered by ArtTree