Trucos útiles de configuración .htaccess

Tras leer un artículo en www.thomsonchemmanoor.com paso a traducirlo/adaptarlo y adaptarlo pues puede ser útil en algún momento para desarrolladores, programadores y administradores de sitios web. Se trata de una colección de directivas y configuraciones disponibles dentro de los ficheros .htaccess para realizar tareas cotidianas en sitios web de gran utilidad.
Crear una página de error 404 personalizada

Mediante .htaccess en un servidor linux bajo apache es una tarea sencilla. Usando un editor de texto simplemente crea un fichero con el nombre .htaccess. Las páginas de error personalizadas dan a tu sitio web mayor profesionalidad permitiendo redirigir los errores a un lugar que permita al usuario volver a la página principal, facilitar ayuda, etc.

Añade las siguientes líneas a tu fichero .htaccess, teniendo en cuenta que las páginas personalizadas de error se encuentran en /error/

ErrorDocument 401 /error/401.php
ErrorDocument 403 /error/403.php
ErrorDocument 404 /error/404.php
ErrorDocument 500 /error/500.php

Configurar la zona horaria del servidor

SetEnv TZ America/Houston

Bloquear IPs usando .htaccess

En ciertos momentos suele ser necesario bloquear el acceso al sitio web o determinados directorios de u una IP o rangos, para hacerlo simplemente añade lo siguiente a tu fichero .htaccess configurando las IPs que desees:

allow from all
deny from 145.186.14.122
deny from 124.15

Redirecciones amigables para SEO con redirects 301 permanentes

Esto es útil para direcciones ya no disponibles, antiguas o movidas a otra URL:

Redirect 301 /d/file.html http://www.htaccesselite.com/r/file.html

Configurar el email del administrador del servidor

ServerSignature EMail
SetEnv SERVER_ADMIN default@domain.com

Bloquear Hotlink con .htaccess

Muy útil para evitar que otros sitios webs utilicen las imagenes de tu servidor y consuman tu ancho de banda, ten en cuenta que si usas RSS tendrás que permitirle la recogida de imagenes:

Options +FollowSymlinks
# Protect Hotlinking
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domainname\.com/ [nc]
RewriteRule .*\.(gif|jpg|png)$ http://domainname.com/img/hotlink_f_o.png [nc]

Bloquear acceso de un determinado User Agent

Un agente de usuario es una aplicación informática que funciona como cliente en un protocolo de red; el nombre se aplica generalmente para referirse a aquellas aplicaciones que acceden a la World Wide Web. Los agentes de usuario que se conectan a la Web pueden ser desde navegadores web hasta los web crawler de los buscadores, pasando por teléfonos móviles, lectores de pantalla y navegadores en Braille usados por personas con discapacidades.
Wikipedia

## .htaccess Code :: BEGIN
## Block Bad Bots by user-Agent
SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Offline.Explorer [NC,OR]
SetEnvIfNoCase user-Agent ^[Ww]eb[Bb]andit [NC,OR]
SetEnvIfNoCase user-Agent ^Zeus [NC]

Order Allow,Deny
Allow from all
Deny from env=bad_bot

## .htaccess Code :: END

Redirigir a los visitantes a otro sitio diferente excepto ciertas IPs

Muy útil para cuando el webmaster está realizando tareas de mantenimiento, redirige a todos los visitantes a la página temporal de mantenimiento mientras que desde su IP sigue trabajando en la página web normal:

ErrorDocument 403 http://www.youdomain.com
Order deny,allow
Deny from all
Allow from 124.34.48.165
Allow from 102.54.68.123

Evitar mostrar el cuadro de solicitud de descarga

Con este código evitas que al pinchar en un enlace (por ejemplo un pdf o pelicula) evitas que salga el cuadro preguntando si quieres descargarlo.

AddType application/octet-stream .pdf
AddType application/octet-stream .zip
AddType application/octet-stream .mov

Cambiar el tipo de fichero a una extensión

Podemos hacer que un determinado tipo de fichero actue como si fuera otro, por ejemplo podemos hacer que las imágenes jpg, los index.html o default.cgi actuen como php

ForceType application/x-httpd-php
SetHandler application/x-httpd-php

Bloquear acceso al fichero .htaccess

El título lo dice todo, bloquear accesos indeseados a nuestro fichero .htaccess, redirigiendolos a un error 403

# secure htaccess file

order allow,deny
deny from all

Proteger acceso a un determinado tipo de fichero

Si por ejemplo quisieramos que nadie pudiera acceder a un fichero llamado default.jpg

# prevent access of a certain file

order allow,deny
deny from all

Evitar la navegación de directorios

Si un determinado directorio no tiene página “index” válida, es probable que nos deje listar los ficheros de la carpeta, para evitar esto podemos cortar la opción de navegación de directorios y mostrar un “Forbidden”:

# disable directory browsing
Options All -Indexes

Cambiar página de inicio o por defecto

Si por ejemplo en vez de index.html queremos que la página de inicio sea default.html:

# serve alternate default index page
DirectoryIndex default.html

Proteger directorios o ficheros con password

Con esta opción podemos solicitar usuario/clave para acceder a una determinada sección de la página web. Existen multitud de webs que hacen esto por tí automáticamente y te facilitan el código, por ejemplo .htaccess Generator. Aquí un ejemplo:

# to protect a file

AuthType Basic
AuthName “Prompt”
AuthUserFile /home/path/.htpasswd
Require valid-user

# password-protect a directory resides
AuthType basic
AuthName “This directory is protected”
AuthUserFile /home/path/.htpasswd
AuthGroupFile /dev/null
Require valid-user

Redirigir viejo dominio a uno nuevo

Simple y efectivo, si hemos cambiado el nombre de dominio de nuestra página web redirigiremos todo el tráfico que siga llegando al viejo hacia el nuevo:

# redirect from old domain to new domain
RewriteEngine On
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

MySQL Tips

Aqui os dejo una pequeña Cheat Sheet con muchos MySQL Tips (Spaninglish owned :D)

MySQL : Crear una base de datos

Crear una base de datos:

$ mysql
mysql > show databases;
mysql > create database joomla;
mysql > use database joomla;

o bien:

$ mysqladmin create joomla

Si es necesario un encoding en particular se necesitan definir el character set y el collate:

  • En ISO:
    mysql > create database joomla character set latin1 collate
    latin1_spanish_ci;
  • En UTF8:
    mysql > create database joomla character set utf8 collate
    utf8_general_ci;

MySQL: Borrar una base de datos

Borrar bases de datos:

$ mysql
mysql > show databases;
mysql > drop database joomla;

o bien:

$ mysqladmin drop joomla

MySQL: Hacer un dump de la base de datos

$ mysqldump -h localhost -u root -p joomla > joomla.sql

donde joomla es la base de datos, root es el usuario de la base datos y localhost el servidor de la base de datos.

MySQL: Importar una base de datos

$ mysql
mysql> create database joomla;
mysql> use joomla
mysql> source joomla.sql

o bien:

$ mysql -u root -p --database=joomla < joomla.sql

MySQL: Importar tablas de una base de datos

$ mysqldump --user=root joomla jos_core_acl_aro jos_core_acl_groups_aro_map jos_users > jos_users.sql

MySQL: Importar la estructura de base de datos

$ mysqldump --no-data --user=root joomla > joomla.sql

MySQL: Vaciar una tabla

$ mysql
> use joomla;
> truncate table jos_users;

MySQL: Cómo generar los scripts individuales para las tablas de una base de datos

El script generate-mysql-tables-scripts.sh

Nota: el usuario es root y no tiene contraseña.

 ~/tmp $ cat generate-mysql-tables-scripts.sh
DATABASE=$1
for i in `echo "use $DATABASE; show tables;" | mysql -u root|grep -v "Tables_in"`
        do
                echo "Dumping $i"
                mysqldump -u root $DATABASE $i > $i.sql
        done

De este modo:

 ~/tmp $ generate-mysql-tables-scripts.sh zyf
Dumping ...
Dumping
.
.
.

MySQL: Importar una base de datos desde un fichero CSV

$ mysql
> load data local infile 'users.csv' into table `jos_users`
> fields terminated by ','
> optionally enclosed by '"'
> lines terminated by '\n\r';

Especificamos que el contenido se encuentra en el servidor, en un fichero llamado users.csv

> local infile 'users.csv'

que los campos se separan mediante comas:

> fields terminated by ','

que el contenido puede estar entrecomillado, y de ser así el contenido se pasará a la BD sin comillas (o en su defecto sin el símbolo especificado en el comando). Si quisiéramos pasar el contenido a la BD con comillas y todo, no especificaríamos esta opción.

> optionally enclosed by '"'

especificando cual es el carácter que señaliza el final de una línea, de no tener nada que marque el fin de una línea omitiríamos esta opción.

> lines terminated by '\n\r'

MySQL: Exportar a CSV una select

Desde la consola de mysql:

> select * from joomla.jos_users into outfile '/tmp/filename.csv'
fields terminated by ',' lines terminated by '\n';

o desde la terminal:

$ mysql -u root joomla -B -e \
"select \* from users " | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > filename.csv

MySQL: Cambiar la contraseña de root en mysql

A todos nos ha pasado alguna vez ir a modificar algo en nuestro servidor MySQL y encontrarnos con:

ERROR 1045: Access denied for user: 'root@localhost' (Using password: YES)

Aquí está la receta:

$ killall mysqld
$ /usr/sbin/mysqld --skip-grant-tables &
$ mysql -u root mysql
mysql> UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> EXIT
$ killall mysqld
$ /usr/sbin/mysqld &

Si se conoce la contraseña anterior sólo sería necesario:

mysql> set password for 'root'@'localhost' = password('');

o en su defecto:

$ mysql -u root mysql
mysql> UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> EXIT

MySQL: Listado de privilegios de MySQL

En la siguiente http://dev.mysql.com/doc/refman/5.0/es/privileges-provided.html página de documentación de MySQL se listan y explican en castellano todos los privilegios de MySQL.

MySQL: Dar privilegios a usuario en una base de datos

Para dar privilegios a un usuario sobre una base de datos ejecutaremos el siguiente comando, en el ejemplo le damos todos los permisos que una base de datos tiene, la sintaxis queda debajo:

$ mysql -u root -p
mysql> grant all on joomla.* to joomla identified by 'joomla';

Donde el primer joomla.* es la base de datos, el segundo el nombre de usuario y por ultimo la contraseña:

mysql> grant all on nombre_de_la_basededatos.* to nombre_usuario identified by ‘contraseña’;

Por último, actualizamos los privilegios:

mysql> flush privileges;

Ya podremos entrar en la base de datos usando el usuario y la contraseña asignada;

$ mysql -u joomla -p

Mostrar privilegios de un usuario de MySQL

mysql> show grants for usuario;

Quitar privilegios a un usuario de MySQL

mysql> revoke privilegio on basededatos.table from usuario;

Mostrar host y usuarios de MySQL

mysql> use mysql;
mysql> select host,user from user;

Eliminar un usuario de MySQL

mysql> drop user usuario;

Permitir acceso remoto a MySQL

Editar el fichero /etc/mysql/my.cnf y comentar la línea: bind-address = 127.0.0.1

vi /etc/mysql/my.cnf
# bind-address          = 127.0.0.1

Después tendríamos que crear usuarios utilizando la siguiente sentencia:

> grant all on basededatos.tabla to usuario@'dirección_ip' identified by 'contraseña';

Ejemplos

Sentencia para establecer permisos en la tabla table de la base da datos database para el usuario user desde el host de la dirección IP 192.168.10.10 con la contraseña password:

> grant all on database.table to user@'192.168.10.10' identified by 'password';

Sentencia para establecer permisos en todas las tablas de la base de datos database para el usuario user desde un host que tiene cualquier dirección IP y sin contraseña:

> grant all on database.* to user@'%';

Modificar codificación del servidor MySQL

Podemos ver la codificación de MySQL mediante el comando:

> show variables;

En este ejemplo vamos a cambiar la codificación a UTF-8. Para ello haremos lo siguiente:

$ vi /etc/mysql/my.cnf

Buscaremos la sección mysqld y después añadiremos las siguientes líneas.

And add these lines under it:

# utf8
init-connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_general_ci

Una vez hecho esto sólo nos queda reiniciar el servicio.

/etc/init.d/mysql stop
/etc/init.d/mysql start

Comprobar codificación de una tabla

mysql> SHOW CREATE DATABASE `prueba`;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| prueba   | CREATE DATABASE `prueba` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

Modificar codificación de una tabla

> ALTER TABLE tabla CONVERT TO CHARSET charset COLLATE collation;

Por ejemplo:

> ALTER TABLE tabla CONVERT TO CHARSET latin1 COLLATE latin1_spanish_ci;

Variables de mysql

$ mysqladmin variables
$ mysqladmin variables | grep datadir
| datadir                         | /var/lib/mysql/             |

Errores comunes

ERROR 1005 (HY000) at line 1: Can’t create table ‘./joomla/jos_users.frm’ (errno: 150)

‘Explicación:

Es un error que puede surgir al importar una base de datos.

Debe de haber algún error en la comprobación de Foreign Keys.

‘Solución:

Añadir la siguiente línea al principio del fichero .sql:

> SET FOREIGN_KEY_CHECKS = 0;

Y después la siguiente línea al final del fichero .sql:

> SET FOREIGN_KEY_CHECKS = 1;

Si sabéis o quereis saber mas pequeños tips de mysql y quereis que los añada aqui hacer un comentario y lo añado 😀