# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Apache: permitir acceso a un directorio con autenticación para una IP / CIDR

ApacheEn su día, en el artículo de trucos sobre .htaccess vimos como configurar la autenticación (solicitando usuario y password) para un directorio dentro de un website (o para el website completo). En este caso lo que vamos a hacer es proteger un directorio pero excluir una IP o rango CIDR para que pueda acceder al mismo saltando esta protección.

Partimos de la base de que tenemos configurado en nuestro website, dentro del fichero .htaccess (o a nivel de virtualhost) la autenticación para todos los usuarios:

AuthType Basic
AuthName “Prompt”
AuthUserFile /var/webs/test.com/.htpasswd
Require valid-user

Ahora queremos que todos los visitantes se autentiquen excepto los que provengan de la IP 192.168.1.128:

AuthType Basic
AuthName “Prompt”
AuthUserFile /var/webs/test.com/.htpasswd
Require valid-user
Order allow,deny
allow from 192.168.1.128
satisfy any

La directiva satisfy any permite, tanto para la autenticación como el acceso, que en el momento que se cumpla uno de los requerimientos se permita la petición, haciendo así bypass de la autenticación. Si por el contrario, se quisiera que se cumplieran todos los requerimientos para acceder usaríamos satisfy all.

Podríamos tambien permitir rangos completos, denegar a IPs o CIDR, etc

allow from 192.168.1
allow from 192.168.1.0/24
...

Apache: servir PHP usando extensión HTML

ApacheExiste la posibilidad de que queramos introducir código PHP dentro de ficheros estáticos (.html, .htm…), de modo que al servir la página a través del navegador dicho código php se ejecute en lugar de mostrarse como texto plano. Este truco valdría tanto para cualquier otra extensión (cgi por ejemplo).

Para realizar esta configuración, debemos utilizar la directiva AddType en el fichero .htaccess del website o directamente a nivel general del servidor web en el fichero httpd.conf.

Lo primero que debemos verificar es que tenemos cargado en Apache el módulo mod_mime, que es el encargado de servir la directiva AddType.

# httpd -l | grep mime
  mod_mime.c

Una vez verificado, si quisieramos mapear las extensiones .html para servir contenido PHP, deberíamos añadir la siguiente directiva al fichero .htaccess:

AddType application/x-httpd-php .php .htm .html .shtml

Si tuvierais varias versiones de PHP instaladas en un mismo servidor, es posible que necesitéis especificar la versión del siguiente modo:

AddType application/x-httpd-php5 .php .htm .html .shtml

o

AddType application/x-httpd-php4 .php .htm .html .shtml

Esto lo podemos añadir también a nivel general en Apache, ya sea directamente en el httpd.conf o en el fichero php.conf junto con el resto de configuraciones de PHP. Si lo añadimos en httpd.conf reiniciamos el servicio tras hacerlo:

# /etc/init.d/httpd graceful

Ahora, si hacemos un fichero test.html con el siguiente contenido, al servirlo en el navegador web ejecutará el código PHP en lugar de mostrarlo como si fuera html puro y duro:

<h1>Prueba ejecutar PHP en fichero HTML</h1>
<? phpinfo ?>

Trucos útiles de configuración .htaccess para desarrolladores

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.

## .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]

.htaccess: Redirigir todo el tráfico hacia una página

Como la mayoría sabéis, .htaccess (Acceso de Hiper-Texto) es el fichero que apache permite utilizar en un sitio web para configurar y personalizar directivas en un determinado website, sin afectar a los demás.

Una configuración muy útil para un website, es en un momento determinado, ya sea por tareas de mantenimiento, problemas con algún servicio, etc es redirigir todo el tráfico entrante hacia una página concreta, esto puede ser realizado añadiendo lo siguiente en un fichero .htaccess en la carpeta raíz del website:

ErrorDocument 403 http://rm-rf.es/mantenimiento.html
Order deny,allow
Deny from all

De este modo, configuramos que toda petición entrante a esta web sea redirigida a una página estática de mantenimiento. En otras palabras, denegamos el acceso a todo el mundo y lo redirigimos a un error 403.

Rizando el rizo, si necesitaramos hacer esto, pero además permitir acceso normal a una determinada IP (nuestra IP por ejemplo, para arreglar un fallo, o lo que sea), podemos permitirlo:

ErrorDocument 403 http://rm-rf.es/mantenimiento.html
Order deny,allow
Deny from all
Allow from XX.XX.XX.XX

Utilizar .htaccess / php.ini en Apache con suPHP

En el momento que compilas apache con suPHP, las directivas incluidas dentro de los ficheros .htaccess dejan de funcionar. Existen dos posibilidades, compilar htscanner para permitir el uso de ficheros .htaccess y todas las directivas que hay dentro de él, o usar un fichero php.ini personalizado dentro de cada virtualhost con las directivas que queramos.

Si preferís la opción de seguir usando .htaccess, acceder aquí para seguir las instrucciones de htscanner, no obstante es mucho más sencilla la segunda opción.

Para la segunda opción, pongamos el caso que para un virtualhost concreto, queremos añadir personalizaciones en un fichero php.ini, para ello añadimos la siguiente línea a su virtualhost, con la ruta en la que se encuentra el fichero php.ini personalizado:

SuPHP_ConfigPath /home/dominio/

Hay que tener en cuenta, que en los php.ini, y suPHP en general no acepta directivas del tipo php_flag o php_admin_flag, os pongo unos ejemplos de como realizar el cambio para que php.ini lo acepte:

Si queremos pasar esta información de un .htaccess:

$ cat .htaccess
php_admin_flag short_open_tag On
php_admin_flag safe_mode Off
php_admin_flag register_globals Off
php_admin_flag magic_quotes_gpc On
php_admin_flag magic_quotes_runtime Off

En un php.ini sería así:

$ cat php.ini
short_open_tag= On
safe_mode= Off
register_globals= Off
magic_quotes_gpc= On
magic_quotes_runtime= Off

En este caso, ubicaríamos el php.ini en /home/dominio/php.ini, y el dominio configurado dentro de este virtualhost recogería estas directivas personalizadas.

Una vez realizado, reiniciando apache recogería los cambios del virtualhost, y creando un phpinfo() podríamos ver si realmente coge las directivas especificadas.

$ vi phpinfo.php

<? phpinfo(); ?>

Deshabilitar directory index en webs bajo Apache

Para deshabilitar el listado de directorios (Directory Index) en sitios web corriendo en un servidor Apache, tendremos que hacer uso del fichero .htaccess, a través del cual podemos personalizar ciertas directivas del servicio web.

Crearemos un fichero .htaccess dentro de la carpeta concreta en la que queramos desactivar el listado de directorios, y si es para el sitio completo, lo haremos en el raíz del sitio. Dentro del fichero .htaccess deberemos poner lo siguiente:

Options -Indexes
Ver el perfil de Alejandro García García en LinkedIn