URL’s amigables con .htaccess

14 01 2008

Una de las características más importantes de htaccess es la posibilidad de permitir crear URL’s amigables para los motores de búsqueda. Una de las características de los lenguajes de scripting para el Web es que permiten automatizar funciones para la publicación de contenido en el sitio. Este procedimiento se hace muchas veces a través del paso de parámetros, generalmente por el método GET. Pues bien, asumiendo que esta introducción ya ha sido bastante comentada en otros artículos veamos los pasos para crear URL’s amigables con htaccess:

Paso 0: lo defino como paso 0 por que es una precondición que podemos tomar en cuenta a la hora de trabajar con la manipulación de URL’s. En este paso, lo que se propone es establecer que las condiciones de reestructuración afectarán solo a determinados tipos de archivos.

# Siempre iniciamos con estas intrucciones
Options +FollowSymLinks
RewriteEngine On
RewriteBase /

Para continuar, es importante recordar que para el uso de estas características es fundamental que el servidor este compilado con el módulo MOD_REWRITE.

Paso 1: antes de iniciar la reescritura de URL es necesario que usted sepa utilizar Expresiones Regulares. Las Expresiones Regulares nos ayudan a no tener que escribir cada regla por cada archivo que queremos “reescribir”. Un buen sitio donde aprender a utilizar Expresiones Regulares es: RegularExpressions.info. También, prepararé en el futuro un tutorial sobre Expresiones Regulares.

Pues bien, con estos dos puntos abarcados, podemos iniciar este tutorial de Reescritura de URL’s. En este primer ejemplo se condiciona que toda petición que tenga como dominio ‘domain.com’ entre a las reglas de reescritura. Dentro de la directiva RewriteRule, se indica que toda petición al dominio sea rediccionado a ‘domain2.com’. La partícula [R=301,L] indica literalmente: Redirección Permanente (Status 301), Última Regla para denotar que las que siguen, indican otras condicionantes.

# Sitio movido a otro sitio permanentemente
# domain.com a domain2.com
RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^(\.)$ http://www.domain2.com/$1 [R=301,L]

El siguiente ejemplo nos muestra una regla mas sencilla. En esta solamente, indicamos que el archivo ‘domain.com/page.htm’ direcciona a ‘domain.com/new_page.htm’. Las RewriteCond FLAGS indican rediccionamiento, que se tome sin Case-sensitive y que esta es la última regla.

RewriteRule ^page$ new_page.htm [R,NC,L]

Podemos crear varias lineas de condiciones, cuando usamos las variables de servidor, como en el primer ejemplo. Generalmente, usaremos la partícula [L] por cada línea para denotar única regla.

Los siguientes dos ejemplos son más complejos y denotan la reescritura de parámetros a estructuras de directorios. En el primer caso seria algo como: cualquier nombre sea el valor del atributo name para ‘categories.php’. El segundo es similar, solamente que incluye una segunda variable. En este se indica que todo aquello que sea para el directorio ‘/articles/’ y que tenga dos niveles será interpretado como ‘titulo’ y ‘pagina’.

# domain.com/category-name-1/ a
# domain.com/categories.php?name=categorie-name-1
RewriteRule ^([A-Za-Z0-9-]+)/?$ categories.php?name=$1 [L]

# domain.com/articles/title/5 a

# domain.com/articles.php?name=title&page=5
RewriteRule ^articles/([A-Za-Z0-9-]+)/([0-9]+)/?$ articles.php?name=$1&page=$2 [L]

Los ejemplos han sido algo básicos pero principalmente se han debido a que no he deseado extender tanto el artículo. Pero como agregado les puedo decir que lo principal sería contar con una copia de: ModRewrite Cheatsheet, disponible desde el sitio de I Love Jack Daniels.

Artículos Relacionados





.htaccess por defecto

8 01 2008

Los autores originales del curso de .htaccess del que me base para escribir esta serie, también publicarón un ejemplo de como podría ser un archivo .htaccess por defecto para sus proyectos

 

# .htaccess por defecto
# Permitir ejecución de scripts CGI y no presentar indice de dirctorios
Options +ExecCGI -Indexes

# Servir automáticamente los archivos de índice (index.(*) ó
# default.(*))
DirectoryIndex index.php index.html index.htm

# Errores
ErrorDocument 400 /cgi-bin/error.php
ErrorDocument 401 /cgi-bin/error.php
ErrorDocument 403 /cgi-bin/forbidden.cgi
ErrorDocument 404 /404.html
ErrorDocument 405 /cgi-bin/error.php
ErrorDocument 406 /cgi-bin/error.php
ErrorDocument 409 /cgi-bin/error.php
ErrorDocument 413 /cgi-bin/error.php
ErrorDocument 414 /cgi-bin/error.php
ErrorDocument 500 /cgi-bin/error.php
ErrorDocument 501 /cgi-bin/error.php

# Firma del Servidor en Off
ServerSignature Off

# Agregando el MIME-Type de los archivos .FLV, .SWF y .ICO
AddType video/x-flv .flv
AddType application/x-shockwave-flash .swf
AddType image/x-icon .ico

# Configurando por defecto el juego de caracteres y el lenguaje

AddDefaultCharset UTF-8
AddLanguage en-US .html .htm .txt .xml .php

# Colocando TIMEZONE y el correo del administrador

SetEnv TZ America/Indianapolis
SetEnv SERVER_ADMIN webmaster@askapache.com

# PHP como Script CGI
### PHPINI-CGI
# AddHandler php-cgi .php
# Action php-cgi /cgi-bin/php5.cgi

# PHP en FAST-CGI
### FAST-CGI
# AddHandler fastcgi-script .fcg .fcgi .fpl
# AddHandler php5-fastcgi .php
# Action php5-fastcgi /cgi-bin/fastcgi.fcgi

# Cabeceras y control de Caché
#
# Caché para un año (realmente 336 días) para estos tipos de archivo
<FilesMatch "\.(flv|ico|pdf)$">
    Header set Cache-Control "max-age=29030400, public"
</FilesMatch>

# Caché para una semana
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
    Header set Cache-Control "max-age=604800, public"
</FilesMatch>

# Caché para tres horas
<FilesMatch "\.(txt|xml|js|css)$">
    Header set Cache-Control "max-age=10800"
</FilesMatch>

# Caché para un minuto
<FilesMatch "\.(html|htm|php)$">
    Header set Cache-Control "max-age=0, private, no-store, no-cache,
                              must-revalidate"

    # -P3P es un estándar propuesto por la W3C para acceso seguro
    Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID
                    CUR ADM DEV OUR BUS\""

    Header set imagetoolbar "no"
</FilesMatch>

# URL’s amigables y Redireccionamientos
#
### Redireccionamientos SEO (según el ejemplo)
# Redirect 301 /ssl-ns.html /htaccess/apache-ssl-in-htaccess.html
# Redirect 301 /ht.tml
# Redirect 301 /index.html /
# RedirectMatch 301 /2006/htaccess-forum/(.*) /2006/htaccess/$1
# RedirectMatch 301 /(.*)rfc2616(.*) http://www.w3.org/Protocols/$1
# RedirectMatch 301 /phpmanual(.*) /manual/en/$1

### Activando MOD_REWRITE
RewriteEngine On
RewriteBase /

### MOD_REWRITE para WordPress
# <IfModule mod_rewrite.c>
#     RewriteEngine On
#     RewriteBase /
#     RewriteCond %{REQUEST_FILENAME} !-f
#     RewriteCond %{REQUEST_FILENAME} !-d
#     RewriteRule . /index.php [L]
# </IfModule>

### Requerir el subdominio WWW
# RewriteCond %{HTTP_HOST} !^www\.somewhere\.com$ [NC]
# RewriteRule ^(.*)$ /$1 [R=301,L]

### Para código enciclado
# RewriteCond %{ENV:REDIRECT_STATUS} 200
# RewriteRule ^.*$ – [L]

### Redireccionar el Blog Feed a FeedBurner
# RewriteCond %{HTTP_USER_AGENT} !^.*(FeedBurner|FeedValidator|Recent) [NC]
# RewriteRule ^feed/?.*$ http://feeds.feedburner.com/somewhere [L, R=302]

### Bloquear WGET?
# RewriteCond %{HTTP_USER_AGENT} ^Wget.* [NC]
# RewriteRule .* /cgi-bin/forbidden.cgi [L]


# Autenticación
#

### Protección Básica
# AuthName "Prompt"
# AuthUserFile /home/somewhere.com/.htpasswd
# AuthType basic
# Require valid-user

### Sitio en Construcción
# AuthName "Under Development"
# AuthUserFile /home/askapache.com/.htpasswd
# AuthType basic
# Require valid-user
# Order Deny,Allow
# Deny from all
# Allow from 23.23.23.1 w3.org googlebot.com google.com
# Satisfy Any

Este ejemplo me ha parecido muy completo y he aprovechado para incluir una pequeña descripción de lo que hace cada paso dentro del archivo.

Artículos Relacionados





Habilitar Mod_Rewrite para Apache en Ubuntu

5 01 2008

Estoy realizando el sitio del proyecto Apperture en mi computador con Ubuntu Linux. Ahora, por alguna extraña razón no funcionan las reglas de reescritura con Mod_Rewrite. Al parecer el problema está en que no tengo instalado el módulo de Mod_Rewrite, asi que he buscado en la red la solución y he encontrado esto:

# a2enmod rewrite && sudo invoke-rc.d apache2 restart

Claro, lo he encontrado como comentario en este artículo que encontre en Google pero que en el paso de editar el archivo /etc/apache2/sites-avalible/000-default me he quedado por “inconsistentencia” en las instrucciones.

Artículos Relacionados





Opciones de Seguridad con .htaccess

2 01 2008

htaccess es para muchas otras cosas, además de la aplicación de Redireccionamientos y personalización de las páginas de error. Otra de las funciones principales de la herramienta es controlar aspectos internos dentro de las carpetas del servidor como la seguridad, el control de acceso a usuarios, etc. En este nuevo artículo de la serie veremos más a detalle estas opciones:

Control de Acceso a Carpetas: algunos ejemplos comunes de este tipo de opción con htaccess es el control de acceso a los directorios mediante contraseñas, bloqueos de motores de SPAM, restricciones por IP, etc.

# Permitir el acceso al motor de Google o a alguien con contraseña
AuthName “Under Development”
AuthUserFile /home/askapache.com/.htpasswd
AuthType basic
Require valid-user
Order Deny,Allow
Deny from all
Allow from 1.1.1.1 w3.org googlebot.com google.com google-analytics.com
Satisfy Any

# Redireccionar todo el tráfico a otro sitio, excepto para una IP
ErrorDocument 403 http://www.somewhere.com
Order deny,allow
Deny from all
Allow from 1.1.1.1

Algunas otras aplicaciones dentro del control del acceso son: forzar la descarga para determinados tipos de archivos y la asignación de scripts para la ejecución de determinadas tareas.

# Archivos .AVI, .MPG, .MOV y .PDF se descargan directamente
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .mov
AddType application/octet-stream .pdf

# Procesar archivos .GIF con un Script CGI
Action image/gif /cgi-bin/filter.cgi

# Procesar peticiones para tipos específicos de petición
Script PUT /cgi-bin/upload.cgi
Script HEAD /cgi-bin/head-robot.cgi

Opciones de Seguridad Avanzadas: este tipo de tecnicas también son importantes y brindan un mayor nivel de seguridad. Entre estas tenemos el uso del protocolo HTTPS y SSL y el del archivo .htpasswd:

# Arreglar el problema de la doble autenticación y garantizando que la
# autenticación via .htpasswd pueda ser ingresada solamente con HTTPS
SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq “somewhere.com”
ErrorDocument 403 https://somewhere.com

# Redireccionar todo lo servido por el puerto 80 a HTTPS
RewriteCond %{SERVER_PORT} ^80$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

Las siguientes son opcines de seguridad via htpasswd:

# Proteger multiples tipos de archivos
<FilesMatch “^(exec|env|doit|phpinfo|w)\.*$”>
    AuthName “htaccess password prompt”
    AuthUserFile /.htpasswd
    AuthType basic
    Require valid-user
</FilesMatch>

# Restringir acceso por IP
Allow/Deny from 10.1.0.0/255.255.0.0

El acceso puede hacerse parcialmente (es decir sin una IP especifica sino permitiendo a todos los que esten dentro de determinado rango).

Este tipo de ejemplos son muy prácticos y sencillos de aprender. Igualmente, seguiré investigando nuevas opciones y funciones para htaccess y publicando periódicamente actualizaciones a los ejemplos. De igual manera es necesario tener siempre a la mano una versión de: Apache HTACCESS CheatSheet para futuras consultas.

Artículos Relacionados





Instalando Perl sobre Apache en Ubuntu

10 12 2007

Perl es un lenguaje multiproposito. De el vienen deribados varios lenguajes de programación como PHP. Hace algunos días me entro la curiosidad de probar como instalarlo en la computadora de mi oficina en Ubuntu 7.10. Debo reconocer que el procedimiento me llevó más de lo que espere. Pero ahora comparto con ustedes el procedimiento y los animo a probar este nuevo lenguaje.

Paso 1: Instalamos MOD_PERL: luego de instalar Apache instalamos MOD_PERL. Este es un módulo que nos nos proporcionará la conexión del lenguaje con el servidor Apache. Así, no tendremos que hacer mayores cambios. Como siempre en distribuciones Linux basadas en Debian es más sencillo instalar este tipo de cosas, utilizando Aptitude / Synaptic

$ sudo apt-get install libapache2-mod-perl2

El anterior procedimiento no resulto tan complicado. Bueno, con esto lo que hacemos es instalar el modulo para Apache. Pero con esto no basta. Recordemos que PERL viene por defecto instalado sobre Linux y al instalarlo en Apache utilizamos CGI (Common Gateway Interface) que viene deshabilitado por defecto.

Paso 2: Agregamos el HANDLED adecuado: . Posteriormente editamos nuestro archivo de configuración de Apache, agregamos las siguientes lineas y reiniciamos el servidor.

$ gedit /etc/apache2/apache2.conf

# Agregamos las siguientes líneas al final del archivo

AddHandler cgi-script .cgi
<Files ~ “\.pl$”>
    Options +ExecCGI
</Files>
<Files ~ “\.cgi$”>
    Options +ExecCGI
</Files>

# Reiniciamos el Servidor
$ /etc/apache2/apache2 restart

Y con solo esto ya tenemos instalado el soporte de Perl sobre Apache. Lo bueno de estos metodos de instalación es que podemos instalar mutliples tecnologías en el mismo servidor. Bueno, en mi caso ha sido para poder probar Movable Type, pero eso es tema de otro articulo.

Artículos Relacionados:





.htaccess: Configurando nuestro Servidor Apache

3 12 2007

El Servidor Apache es un gran servidor de código abierto. Entre sus grandes características destacan los archivos de configuración .htaccess. Según los define la propia documentación de Apache, los archivos .htaccess permiten hacer “cambios de configuración” dentro de las estructuras de los directorios desde controles de acceso / bloqueo, direccionamientos y la definición de reglas para manipulas URL’s.

La siguiente es un guía práctica de ejemplos de las diferentes directivas que permite configurar estos archivos y de que manera podemos aprovecharlas para obtener un mejor desempeño a nuestro servidor; tanto en entornos de Servidores Dedicados como compartidos.

¿Qué es un archivo .htaccess?: como ya habíamos podido leer, un archivo de este tipo es un archivo que contiene directivas que Apache puede interpretar y aplicar al directorio en el que se encuentra al archivo y los subdirectorios dentro de el. Lo general es que este archivo se nombre como .htaccess dentro del servidor. Pero el nombre puede cambiarse mediante la directiva AccessFileName de Apache.

Ahora bien, los permisos de configuración dependen de los establecidos dentro del archivo de configuración de Apache mediante la directiva AllowOverride. Podemos permitirlas todas, denogar todo o permitir solo ciertas opciones.

# No permitir ninguna directiva
AllowOverride None

# Permitir todo
AllowOverride All

Las directivas de un archivo .htaccess son aplicadas a los subdirectorios, pero si un directorio tiene otro archivo de configuración, dependiendo de estas directivas puede causarse que las segundas sobreescriban las de la carpeta superior.

¿Cómo y cuando usar un archivo .htaccess?: Se nos recomienda que es uso de archivos .htaccess sea exclusivo en casos donde no se tiene acceso al archivo de configuración principal de Apache (llamdo httpd.conf). Esto seguramente será por que hasta cierto punto es un riesgo de seguridad el tener archivos de configuración junto con las carpetas en las que navegan los usuarios dentro de nuestro sitio. Ahora, pasando al tema de como utilizarlo; decir que basta con crear un archivo con ese nombre, colocar las directivas dentro del mismo y subirlo al servidor. Con eso, cada vez que Apache detecte la presencia de este archivo, ejecutará su contenido. Dentro de un archivo .htaccess podemos incluir directivas de definición de interpretes, redireccionamientos, control de acceso de permisos y las famosas URL’s amigables.

También debemos recordar que en muchas ocasiones, en especial en las URL’s amigables, es necesario tener conocimientos de Expresiones Regulares.

Redireccionamientos:

# Redireccionamiento a un archivo simple
Redirect 301 /path/old.html /path/new.html

# Redireccionando la pagina de inicio a un nuevo dominio
Redirect 301 / http://www.newdomain.com/

# Redireccionando multiples archivos
RedirectMatch 301 /blog(.*) /$1

# Redireccionando temporalmente a la página de “offline”
RedirectMatch 302 ^/ /temporary-offline.html

Documentos de Error:

Los documentos de Error son importantes para los navegantes en nuestro sitio. Entre ellos el más característico es el error 404 (Documento no encontrado).

# Documento no Encontrado
ErrorDocument 404 /404.php

Cabeceras Personalizadas con .htaccess

# Prevenir el cacheo de archivos HTML, CSS y JavaScript
<FilesMatch "\.(html|htm|js|css)$">
    FileETag None
    Header unset ETag
    Header set Cache-Control "max-age=0, no-cache, no-store, private"
    Header set Pragma "no-cache"
    Header set Expires "0"
</FilesMatch>

# Agregar la cabecera de idioma y de juego de caracteres
# sin META-tags
AddDefaultCharset UTF-8
AddLanguage es-GT .html .htm .css .js

Estas son solo algunas de las directivas que puede manejar este archivo de configuración. Existen muchos más ejemplos útiles que poco a poco se hiran incluyendo dentro de la serie.

Artículos Relacionados





Windows, Apache, MySQL y Python: el otro WAMP

6 11 2007

Desde que empece a escuchar acerca del lenguaje de programación Python, me llamó la atención por varios motivos. El principal consistía en que el motor de búsqueda Google utiliza principalmente esta tecnología en su desarrollo de aplicaciones. Por lo cual pense que debía existir algún motivo por el cual, Python fuese especial.

Python es en si un lenguaje multiproposito. Es utilizado mucho en aplicaciones con un grado de complejidad bastante grande. Tiene mucho soporte para manejo de recursos a bajo nivel. También puede interactuar con el sistema operativo y existe soporte para muchos sistemas operativos.

Pues bien, entre mis investigaciones y pruebas he encontrado el método de instalar Python en un Servidor Apache. En este artículo describire el proceso para el sistema operativo Windows:

Paso 1: Instalar Apache para Windows. El proceso no es complicado. Lo fundamental es instalarlo desde un paquete de instalación. Como en todos los artículos que he redactado, creo que la mejor opción es instalar Apache en el directorio: C:\apache por que permite un mejor acceso. Instalaremos la versión 2.0.x de Apache. La nueva version 2.2.x ha resultado trabajar de manera distinta.

Paso 2: Descargar el paquete de instalación de Python para Windows. La web del proyecto es http://www.python.org. La instalación es bastante sencilla si elegimos el proceso de instalación mediante el paquete automático. Lo recomendable: instalar en C:\apache\python.

En si, no existe un modulo nativo de Apache para conectar el servidor con Python. El conector se podría hacer mediante un intérprete CGI, pero suele ser más lento a la hora de procesar los scripts. Sin embargo, existe un proyecto llamado mod_python que desarrolla un módulo de conexión. Podemos bajarlo desde la página del proyecto Apache. Debemos de tener cuidado con la versión que descargamos del módulo. El archivo que descarguemos, indica la versión de Python a la que da soporte. En nuestro caso, como instalaremos Pytnon version 3.58, descargaremos el archivo mod_python-3.3.1.win32-py2.5-Apache2.0.exe.

Durante el proceso de instalación, el programa nos pedirá indicar la ruta en que hemos instalado los archivos de Python (en mi caso: c:\apache\python). Mostrará un mensaje de confirmación y nuevamente nos pedirá que especifiquemos la ruta, esta vez de Apache (c:\apache\ por ejemplo) y las instrucciones de instalación del linker para Apache.

# Agregamos el módulo en el archivo httpd.conf
LoadModule python_module modules/mod_python.so

Al terminar, reiniciamos Apache. El instalador de Mod_Python, nos indicará que nos dirijamos a la página de especificación y de testeo. A continuación hago una traducción libre de parte del documento:

# Creamos un archivo .htaccess desde el directorio en el que
# queremos que sean interpretadas la páginas con Python

# Agregamos al .htaccess:
AddHandler mod_python .py
PythonHandler mptest
PythonDebug On

La directiva AddHandler le asigna a Mod_Python la función de interpretar los archivos con extensión ( .py ). No soy experto en Python, recién estoy empezando a incursionar en el lenguaje. La directiva PythonHandler mptest indica el lanzador de Python y PythonDebug On enciende el interprete.

# Ahora creamos el archivo mptest.py y agregamos
from mod_python import apache

def handler(req):
    req.content_type = "text/plain"
    req.write("Hello World!")
    return apache.OK

Como podemos apreciar, según el documento, y para propositos de prueba el nombre del script es el mismo que el indicado en el .htaccess como lanzador. Otra cosa interesente. El código en Python es sensible a indendación.

Artículos Relacionados:








Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.