martes, 10 de julio de 2012

Parámetros en .htaccess


.htaccess (Acceso de Hiper-Texto) es un archivo de texto que Apache usa para crear reglas sobre los directorios y los archivos. Tiene múltiples funciones y en lo personal me parece una herramienta sumamente interesante.
A manera de glosario anexo simbologías utilizadas en el archivo .htaccess con la intención de que podamos comprender mejor el código y a la vez personalizarlo según necesidades específicas.

Se ignora la línea.
[F] 
Forbidden: para forzar un acceso denegado. 403 Forbidden.
[L]
Last rule: para indicar que es la última regla que debe aplicarse
[N]
Next: indica continuación hasta que las directivas sean logradas
[G]
Gone: indica al servidor entregar "Gone" (ya no existe)
[P]
Proxy: instruye al servidor para manejar los pedidos por mod_proxy
[C]
Chain: Instruye al servidor para encadenar la regla actual con la regla previa.
[R]
Redirect: indica redirección.
[NC]
No Case: para indicar que en la directiva no debe distinguirse entre mayúsculas y minúsculas.
[PT]
Pass Through: pasa el URL al Apache para seguir procesando.
[OR]
Or: para indicar que la expresión actual debe interpretase como una alternativa a la anterior.
[NE]
No Escape: instruye al servidor para analizar las salidas sin escapar carácteres.
[NS]
No Subrequest: para saltar directivas de sub-pedidos internos.
[QSA]
Append Query String: para agregar un query string al final de la expresión (URL).
[S=x]
Skip: para saltar las siguientes "x" reglas.
[E=variable:value]
Environmental Variable: para agregar una variable a un valor.
[T=MIME-type]
Mime Type: declara mime-type al recurso.
[]
dentro de los paréntesis se encierran carácteres que definen los resultados.
[]+
se utiliza para hacer combinaciones.
[^]
excluye los carácteres dentro del paréntesis, de los resultados. Ejemplo [^xyz].
[a-z]
solamente letras.
[a-z]{1,10}
palabras entre 1 y 10 caracteres.
[0-9]
solamente números.
[0-9]{4}
números de 4 cifras.
(.*)
cualquier expresión.
a{n}
especifica el número exacto del caracter que le precede.
a{n,}
especifica el número "o más" del caracter que le precede.
a{n,m}
especifica un rango entre "n" y "m". Ejemplo x{4,7} resulta 4,5,6 o 7 x´s.
()
agrupa carácteres
^
denota "el principio" del argumento.
$
denota "el fin" del argumento.
?
Declara como opcional el caracter anterior.
!
declara negación (excepto). Ejemplo: "!string" resulta "excepto string".
.
el punto indica "cualquier caracter arbitrario".
-
intrucción “not to”.
+
declara "uno o más" del caracter que le precede.
|
declara "or". Ejemplo (x|y) resulta "x" o "y".
\
para leer caracteres especiales. Ejemplo “\.” indica literalmente un punto.
/*
indica cero o más "/".
.*
indica cero o más caracteres arbitrarios.
^$
indica un "empty string".
^.*$
pauta estándar para obtener todo.
[^/.]
define, un caracter que no es "/" ni ".".
[^/.]+
define, ningún número de caracter que tenga "/" o ".".
http://
es literalmente “http://”.
^domain.*
define un string que comienza con el término "domain" y continúa con cualquier número de caracteres.
^domain\.com$
define exactamente “domain.com”.
-d
prueba si el string es un directorio existente.
-f
prueba si el string es un archivo existente.
-s
prueba si el archivo en el string no tiene valor cero.

Directivas de .htaccess


Directivas de .htaccessEnviar a un amigo
De forma general se puede decir que las directivas en el .htaccess se componen de tres partes: el tipo de directiva (Options, RewriteCond), los parámetros de la directiva y por último el final de cada línea en que se pueden agregar modificaciones adicionales.
Las expresiones regulares son patrones de cadenas de textos que se definen utilizando símbolos como el de oclusión (^) para indicar el inicio, el del dólar ($) para señalar el final, el cierre de interrogación (?) para un carácter opcional, el asterisco (*) para varios caracteres opcionales.
Los valores que aparecen entre corchetes al final de cada línea son modificadores o acciones. Por ejemplo, para RewriteCond se puede utilizar [NC] para indicar que en la directiva no debe distinguirse entre mayúsculas y minúsculas (no case), u [OR] para indicar que la expresión actual debe interpretase como una alternativa a la anterior: Por su parte, RewriteRule admite otros modificadores propios, como [F] para forzar un acceso denegado (forbidden), o [L] para indicar que es la última regla que debe aplicarse (last rule). Ejemplo:
Cambiando la página por defecto:
Se puede utilizar esta instrucción para cambiar la página por defecto (el orden es importante)
DirectoryIndex inicio.html index.htm index.html index.php

Redireccionar el tráfico web:
Redirect /antiguo.php http://sitio.com/nuevo.php

Limitar los tipos de ficheros que pueden subirse a un directorio
php_value engine off
AddType text/plain .htm .html .shtml

Contenido dependiente del Navegador
Para redirigir el contenido en función del navegador se puede utilizar el valor de "User-Agent" que aparece en la cabecera HTTP de las peticiones, y con el que normalmente se identifica el navegador. Por ejemplo, las siguientes líneas colocadas en un fichero .htaccess harían que cuando un agente solicitará la página index.html se le sirviese la página index.opera.html si se identifica como "Opera/*", la página index.mozilla.html si se identifica como "Mozilla/*" y la página index.html en cualquier otro caso.:
RewriteCond %{HTTP_USER_AGENT} ^Opera/*
RewriteRule ^index\.html$ index.opera.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/*
RewriteRule ^index\.html$ index.mozilla.html [L]
RewriteRule ^index\.html$ index.html [L]

Los asteriscos en las expresiones regulares de las directivas casan con cualquier cadena de texto. Y en este caso en concreto se utilizan para redirigir el contenido dependiendo del nombre del agente sin tener en cuenta la versión, que suele indicarse a continuación de la barra, como "Mozilla/3.0", "Mozilla/4.0", "Mozilla/5.0", …

Especificar el e-mail por defecto del administrador del server:
# e-mail del administrador del server
SetEnv SERVER_ADMIN nombre@sitio.com

Especificar el lenguaje por defecto del server:
# lenguaje por defecto del server
DefaultLanguage en-US

Declarar específicos MIME types:
# agregar mime types
AddType application/x-shockwave-flash .swf
AddType video/x-flv .flv
AddType image/x-icon .ico

Prevenir accesos al archivo .htaccess:
# asegurar htaccess
<Files .htaccess>
order allow,deny
deny from all
</Files>

Prevenir acceso a un archivo específico:
<files nombre.jpg>
order allow,deny
deny from all
</files>

Prevenir acceso a múltiples archivos (puedes variar las extensiones):
<FilesMatch "\.(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
Order Allow,Deny
Deny from all
</FilesMatch>


Evitar acceso por el navegador a una carpeta sin "index":

Options All -Indexes

Permitir acceso por el navegador:
Options All +Indexes

Evitar el listado de directorios:
IndexIgnore *

Evitar que se muestren tipos de archivo:
IndexIgnore *.wmv *.mp4 *.avi *.etc

Disfrazar la extensión de los archivos:
# los archivos foo se reconocerán como php
AddType application/x-httpd-php .foo

Proteger directorio de un IP y/o dominio:
<Limit GET POST PUT>
order allow,deny
allow from all
deny from 12.345.67.890
deny from .*domain\.com.*
</Limit>

Denegar todo acceso a un directorio excepto el IP especificado:
<Limit GET POST PUT>
order deny,allow
deny from all
allow from 12.345.67.890
allow from .*domain\.com.*
</Limit>

Bloquear visitantes que provienen del dominio especificado:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} scumbag\.com [NC,OR]
RewriteCond %{HTTP_REFERER} wormhole\.com [NC,OR]
RewriteRule .* - [F]
</ifModule>

Denegar acceso de rango de IP (CIDR):
Deny from 10.1.0.0/16
Deny from 80.0.0/8

Permitir acceso de rango de IP (CIDR):
Allow from 10.1.0.0/16
Allow from 80.0.0/8

Denegar rango de IP:
Recuerda que se lee de izquierda, "Cualquier IP que comience con":
Deny from 99.88.77.66
Deny from 99.88.77
Deny from 99.88
Deny from 99

Permitir rango de IP
Allow from 99.88.77.66
Allow from 99.88.77
Allow from 99.88
Allow from 99

Evitar Hotlink:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.com/.*$ [NC]
RewriteRule .*\.(gif|jpg)$ http://www.domain.com/eatme.jpe [R,NC,L]
</ifModule>
Puedes agregar otros sitios debajo de la lìnea en que aparece el dominio:
RewriteCond %{HTTP_REFERER} !^http://(www\.)?sitio\.com/.*$ [NC]

Bloquear robots maliciosos:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR]
RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:craftbot@yahoo.com [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule .* - [F]

Se puede personalizar el error generado a estos robots modificando la última línea (RewriteRule) de esta forma:
RewriteRule ^.*$ http://www.pagina_de_error.com [R,L]
Te recomiendo que uses la siguiente línea en tu .htaccess. Referente al bloqueo de Robots y Referers maliciosos:
RewriteEngine on
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?gameday.de.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?play-texas-holdem.gameday.de.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?forever.kz.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?craps.forever.kz.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?roulette-online.forever.kz.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?play-poker.forever.kz.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?onlinecasino.forever.kz.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?texashold-em.freeservers.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?playonline.inn7winter.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?poker-new.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?available-poker.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?free-poker.available-poker.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?texasholdem.prv.pl.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?prv.pl.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?homestead.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?texaspoker.homestead.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?t-e-x-a-s-poker.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?texas-poker.olo.cc.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?holdem-poker.servertown.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?online-poker.played.by.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?empire-poker.black-poker.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?black-poker.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?free.fr.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?pc800cdf.free.fr.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?free-poker.standard-poker.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?cameralover.net.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?golfshoot.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?bitlocker.net.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?bayfronthomes.net.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?cafexml.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?turniptruck.com.*$ [NC]
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?trojan-horse.co.uk.*$ [NC]
RewriteRule .* - [F,L]
RewriteCond %{REMOTE_HOST} adm-muenchen\.de [NC,OR]
RewriteCond %{REMOTE_HOST} cyveillance\.com [NC,OR]
RewriteCond %{REMOTE_HOST} lightspeedsystems\.com [NC,OR]
RewriteCond %{REMOTE_HOST} pea016-29980-net-adsl-01\.altohiway\.com [NC,OR]
RewriteCond %{REMOTE_HOST} smartservercontrol\.com [NC,OR]
RewriteCond %{REMOTE_HOST} syntryx\.com [NC,OR]
RewriteCond %{REMOTE_HOST} proxad\.net [NC]
RewriteRule ^.*$ - [F]
RewriteCond %{HTTP_USER_AGENT} ^$ [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:craftbot@yahoo.com [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Custo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^DISCo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Download\ Demon [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^eCatch [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Express\ WebPictures [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^FlashGet [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^GetRight [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^GrabNet [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Grafula [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^HMView [NC,OR]
RewriteCond %{HTTP_USER_AGENT} HTTrack [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Stripper [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Sucker [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Indy\ Library [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^InterGET [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Internet\ Ninja [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Java [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^JetCar [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^JOC\ Web\ Spider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^larbin [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^lwp:: [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^lwp- [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Mass\ Downloader [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^MIDown\ tool [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Mister\ PiX [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Navroad [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^NearSite [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^NetAnts [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^NetSpider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^NetZIP [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Octopus [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Explorer [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Navigator [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Papa\ Foto [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^pavuk [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^RealDownload [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^ReGet [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Schmozilla [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Surfbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Teleport\ Pro [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Image\ Collector [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Sucker [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebAuto [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebCopier [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^webcollage [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebFetch [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebGo\ IS [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebReaper [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebSauger [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ eXtractor [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ Quester [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebStripper [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebZIP [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Wget [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Widow [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeuse [NC]
RewriteRule ^.*$ - [F]

Bloquear "referrers" específicos. En este ejemplo se bloquea a1b2.com:
RewriteCond %{HTTP_REFERER} ^http://www.a1b2.com$
RewriteRule !^http://[^/.]\.tusitio\.com.* - [F,L]

Redirecciona lo que venga de "a1b2" a una imagen:
RewriteCond %{HTTP_REFERER} ^http://.*a1b2.*$ [NC]
RewriteRule .* http://www.tusitio/imagen.jpg [R]

Redirecciona el tráfico que viene de cierta dirección o rango de dirección a otra página:
RewriteCond %{REMOTE_ADDR} 192.168.10.*
RewriteRule .* http://www.tusitio.com/otrapagina.html [R]

Asignar permisos CHMOD automáticamente a tipos de archivos:
chmod .htpasswd files 640
chmod .htaccess files 644
chmod php files 600

Protección contra ataques DOS, limitando el tamaño de archivos que suben al server.
(10000000 bytes equivale a 10 megabytes). Esta línea es útil si permites que los usuarios de tu sitio suban archivos.
LimitRequestBody 10000000

Proteger directorios evitando la ejecución de scripts (edita las extensiones según lo requerido):
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI

Páginas de error personalizadas:
ErrorDocument 400 /errors/400.html
ErrorDocument 401 /errors/401.html
ErrorDocument 403 /errors/403.html
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/500.html

Autocorrección de pequeños errores de escritura:
<IfModule mod_speling.c>
CheckSpelling On
</IfModule>

Permitir al usuario descargar o abrir archivos multimedia (por lo general sólo se abren):
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .wmv
AddType application/octet-stream .mp3

Redireccionar visitantes a una dirección alternativa, menos a ti (modifica el IP):
ErrorDocument 403 http://www.sitio-alternativo.com
Order deny,allow
Deny from all
Allow from 200.105.77.66

Prevenir el acceso a un directorio a una hora u horas específicas:
# una hora
RewriteCond %{TIME_HOUR} ^12$
RewriteRule ^.*$ - [F,L]

# varias horas
RewriteCond %{TIME_HOUR} ^(12|13|14|15)$
RewriteRule ^.*$ - [F,L]

Redireccionar permanentemente www.sitio.com a sitio.com:
RewriteEngine on
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^www\.sitio\.com$ [NC]
RewriteRule ^(.*)$ http://sitio.com/$1 [R=301,L]

Redireccionar vieja página a la nueva:
RewriteEngine On
RewriteRule ^(.*)$ http://www.nueva.com/$1 [R=301,L]

Redirecionar el sitio vía 301:
redirect 301 / http://www.domain.com/

Redireccionar archivo específico vía 301:
redirect 301 /archivo.html http://www.domain.com/nuevo-archivo.html


Redireccionar sitio vía "permanent":
Redirect permanent / http://www.domain.com/

Redireccionar página o directorio vía "permanent":
Redirect permanent viejo-archivo.html http://www.domain.com/nuevo-archivo.html
Redirect permanent /viejo-directorio/ http://www.domain.com/nuevo-directorio/

Redireccionar archivo usando "RedirectMatch":
RedirectMatch 301 ^.*$ http://www.domain.com/index.html

Activar compresión
Se puede habilitar la compresión de datos inherente de PHP para ahorrar ancho de banda
<ifmodule mod_php4.c>
php_value zlib.output_compression 16386
</ifmodule>

No mostrar ‘www’
RewriteEngine on
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^www\.sitio\.com$ [NC]
RewriteRule ^(.*)$ http://sitio.com/$1 [R=301,L]

Evitando el error 500
Pasando el juego de caracteres se evita el mostrar un error 500
AddDefaultCharset utf-8

miércoles, 4 de mayo de 2011

unterminated literal string

_ Tal vez nos hayamos topado con este mensaje en la consola de error de Firebug, pasa que javascript no lee el salto de linea \n, a veces nuestros datos proceden de administradores de contenido que son insertados copiando y pegando, y al mostrarlos nos da este error "unterminated literal string", en este post mostraré como librarnos de él en Javascript y en PHP:

En Javascript usaremos la siguiente función:
function nl2br(value) {
  return value.replace(/\n/g, "
");
}
En php usaremos la función nl2br
Asi:
echo nl2br("foo isn't\n bar");
//lo que nos dará como resultado:
foo isn't
bar

jueves, 27 de enero de 2011

Obtener los tweets un usuario

En está ocasión de una manera sencilla vamos a obtener los ultimos mensajes de un usuario que llamaremos usuariox en Twitter:

Como recordaremos en el capitulo anterior de como usar CURL para acceder a los datos de una URL EXTERNA, usaremos nuestra funcion file_get_contents_curl para acceder a los ultimos tweets de usuariox de la siguiente manera:
//nuestra función del artículo anterior:
function file_get_contents_curl($URL)
    {
        $c = curl_init();
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($c, CURLOPT_URL, $URL);
        $contents = curl_exec($c);
        curl_close($c);

        if ($contents) return $contents;
            else return FALSE;
    }
//Aquí la usamos:
$jsont = file_get_contents_curl("http://twitter.com/statuses/user_timeline/usuariox.json");
$jsont = json_decode($jsont, true);
//echo $json[0]['text'];

// or display last 3
for($i=0; $i < 3 && isset($jsont[$i]); $i++) {
echo $jsont[$i]['text']."
";
}
Pero queremos mostrar como links los http, entonces haremos esto:
//con este metodo cambiaremos todos los link como http o mailto a enlaces.
function make_links_blank($text)
{
  return  preg_replace(
     array(
       '/(?(?=]*>.+<\/a>)
             (?:]*>.+<\/a>)
             |
             ([^="\']?)((?:https?|ftp|bf2|):\/\/[^<> \n\r]+)
         )/iex',
       '/]*)target="?[^"\']+"?/i',
       '/]+)>/i',
       '/(^|\s)(www.[^<> \n\r]+)/iex',
       '/(([_A-Za-z0-9-]+)(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-]+)
       (\\.[A-Za-z0-9-]+)*)/iex'
       ),
     array(
       "stripslashes((strlen('\\2')>0?'\\1\\2\\3':'\\0'))",
       '',
       "stripslashes((strlen('\\2')>0?'\\1\\2\\3':'\\0'))",
       "stripslashes((strlen('\\2')>0?'\\0':'\\0'))"
       ),
       $text
   );
}
function file_get_contents_curl($URL)
    {
        $c = curl_init();
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($c, CURLOPT_URL, $URL);
        $contents = curl_exec($c);
        curl_close($c);

        if ($contents) return $contents;
            else return FALSE;
    }
//Aquí la usamos:
$jsont = file_get_contents_curl("http://twitter.com/statuses/user_timeline/usuariox.json");
$jsont = json_decode($jsont, true);
//echo $json[0]['text'];

// or display last 3
for($i=0; $i < 3 && isset($jsont[$i]); $i++) {
echo make_links_blank($jsont[$i]['text'])."
";
}

domingo, 23 de enero de 2011

file_get_contents vs curl

A más de uno os habrá pasado que su servidor emite un warning al usar file_get_contents("URL_EXTERNA"), y es que esta función interna de PHP, expone una vulnerabilidad a la seguridad de tu aplicación web, en PHP 5 no es posible cambiar el valor de esta a on en .htaccess, tendrías que tener acceso al php.ini del servidor.
La vulnerabilidad trabaja de la siguiente manera:
_ Al usar esta función para recuperar datos desde ubicaciones remotas como un servidor FTP o sitio web y no hacer el filtro apropiado al pasar los datos, dejas abierta tu aplicación a una muy posible inyección de código.

Recomendaciones

Usted debe desactivar allow_url_fopen en el archivo php.ini:

Deshabilitar allow_url_fopen por razones de seguridad
allow_url_fopen = 'off'

Esta configuración tambien debe ser deshabilitada en apache httpd.conf

# Deshabilitar allow_url_fopen por razones de seguridad
php_flag allow_url_fopen off php_flag allow_url_fopen off


Te quedan 2 cosas por hacer:
1) O habilitas file_get_contents en el servidor con su consiguiente vulnerabilidad.
2) O usas CURL o HTTP, para acceder a contenidos de URL externa.

Recomiendo usar CURL por estas razones:
1) Es un promedio de 39% más rapido como se ve aqui.

2) Es seguro por que viene integrado con metodos internos de seguridad.

Ahora que tal vez hayas decidido decidido usar CURL te preguntaras ¿como lo hago?, ¿qué es eso?:
Acerca de CURL puedes Googlear y encontrarás mucha info de él.
Ahora vamos a usarlo.

Primero tu servidor debe de tener el módulo CURL instalado, la mayoría de servidores Apache vienen con CURL activado, si usas IIS verifica que lo tengas instalado.

Luego usarlo en tu código de esta manera:
//Puedes usarlo en una clase Helper o en una función como en el ejemplo
 
function file_get_contents_curl($URL)
    {
        $c = curl_init();
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($c, CURLOPT_URL, $URL);
        $contents = curl_exec($c);
        curl_close($c);

        if ($contents) return $contents;
            else return FALSE;
    }

//Modo de uso:

$result=file_get_contents_curl("http://www.example.com");
if ($result === false)
{
    // treat error
} else {
    // handle good case
} 

Saludos.

martes, 11 de enero de 2011

Sistema Administrador de Contenidos

Despues de una para prolongada por motivos de trabajo, escribo algo sobre lo que se de CMS (Content Management System), He aquí algunos tips:


Tener en cuenta los aspectos de optimización web para el posicionamiento en buscadores a la hora de implementar un gestor de contenidos puede evitar que nuestra inversión en contenidos quede devaluada por una pobre presencia en los buscadores.


Los gestores de contenido


La generación, publicación y archivo de un enorme número de páginas en los grandes portales y sitios Web plantea múltiples retos que los sistemas de gestión de contenidos web (o CMS, de Content Management System) han tratado de resolver en los últimos años:





* Facilitar la generación y edición de contenidos para la Web por parte de personal sin formación específica en programación.


* Asegurar una apariencia homogénea de todos los contenidos y su presentación de acuerdo con un diseño corporativo y con una línea editorial predefinida.


* Mantener una coherencia en la estructura de los sitios Web, permitiendo la incorporación de nuevos contenidos en las secciones adecuadas tras la aprobación y el control previo de las personas indicadas.


* Mantener una navegación consistente que permita a los usuarios llegar a cada uno de los contenidos que están publicados en cada momento.


* Evitar la existencia de contenido duplicado (distintas direcciones URL que muestran un mismo contenido), contenido huérfano (archivos que quedan en el servidor de forma innecesaria ya que son páginas a las que ya no apunta ningún enlace o archivos de imagen o multimedia que se mostraban en páginas suprimidas) o bien enlaces rotos, que apuntan a páginas que no existen en el servidor.





Los gestores de contenidos o CMS son herramientas de software que permiten descentralizar las labores de mantenimiento del contenido de un portal, de forma que personal no técnico de los distintos departamentos de una empresa puede añadir, editar y gestionar su propio contenido en una Web corporativa.


CMS y posicionamiento en buscadores: ¿una simbiosis imposible?


Sin embargo, y a pesar de sus evidentes ventajas, el enfoque tradicional de este tipo de herramientas se ha centrado en facilitar al máximo la gestión de los contenidos simplificando los procesos de producción, aprobación y publicación de los mismos, más que en generar páginas web debidamente optimizadas para ser competitivas en los buscadores.


Los factores que hacen que un portal web sea amigable para los buscadores se analizaron en distintos artículos de esta sección, así como en la Guía Básica de Posicionamiento en Buscadores.


Entre los problemas que, desde el punto de vista de la optimización para el posicionamiento en buscadores, aparecen de forma recurrente en los portales soportados por sistemas gestores de contenido, destacan los siguientes:





* URLs dinámicas: los buscadores limitan en ocasiones el número de variables dinámicas presentes en las URLs que indexan. Las páginas generadas por muchos gestores de contenidos incluyen frecuentemente un elevado número de variables dinámicas en su dirección URL.


* Títulos únicos: el título de una página es uno de los factores más importantes a la hora de posicionar bien en buscadores un contenido. Sin embargo, muchos sistemas gestores de contenidos no permiten a los usuarios asignar un título único relevante a cada página.


* Falta de soporte para metaetiquetas: muchos CMS no disponen de campos específicos para que el usuario pueda especificar el contenidos de las metaetiquetas Keywords y Description. Aunque no son tan importantes como el título para lograr una buena posición en los buscadores, estas etiquetas siguen jugando un papel relevante a la hora de que el usuario prefiera hacer click sobre nuestro sitio en una página de resultados de búsqueda.


* Ausencia de palabras clave en las URL: las URLs dinámicas generadas por muchos sistemas de gestión de contenido suelen ser poco amigables tanto para el usuario como para los buscadores, y no incluyen términos de búsqueda que contribuyen a un mejor posicionamiento.


* Imposibilidad de una optimización posterior: el proceso de producción de contenidos que impone el uso de un sistema CMS dificulta enormemente la optimización a posteriori de los contenidos generados y, en el mejor de los casos, añade una carga de trabajo extra que podría evitarse si los aspectos SEO se hubieran tenido en cuenta en la implementación del gestor.





Resulta, pues, paradójico que precisamente sean aquellas empresas que más recursos invierten en el mantenimiento y generación de nuevos contenidos para sus portales las que, al mismo tiempo, menos se beneficien del volumen que dicho tráfico podría movilizar debido a una pobre implementación de sus sistemas de gestión de contenidos, desde el punto de vista del posicionamiento en buscadores. Un fallo que, en muchos casos, no se debe a carencias de la herramienta en sí, sino a un desconocimiento por parte de los técnicos que la implementan de la importancia que tiene que los contenidos generados por ella puedan ser competitivos en los buscadores.


Hacer del gestor de contenido la mejor herramienta SEO


Pero, de la misma forma que un gestor de contenidos mal implementado puede mermar el rendimiento de la inversión en generación de contenidos de un portal, uno que haya tenido en cuenta los aspectos básicos de la optimización web para el posicionamiento en buscadores puede ser el aliado más eficaz para generar contenidos que conseguirán escalar los puestos de las búsquedas más competidas. Veamos cómo.





*


Emplear código valido según W3C: los gestores de contenido parten de plantillas prediseñadas, que los usuarios no pueden alterar, para generar las nuevas páginas. Si validamos el código de estas plantillas en origen, nos aseguramos de que las páginas generadas a partir de ellas contendrán también código válido. El empleo de código válido asegura que la página se mostrará correctamente en los distintos navegadores y que los buscadores serán capaces de rastrearla sin problemas.


*


Crear un mapa del sitio: casi todos los gestores de contenidos permiten crear y mantener actualizado un mapa del sitio. Los buscadores limitan el número de enlaces que pueden seguir a 100 por página y han de ser enlaces normales de texto HTML. Si ajustamos nuestro gestor de contenido para que genere y mantenga un mapa jerárquizado del sitio web con estas premisas, facilitamos a los buscadores que puedan rastrear todas y cada una de las páginas de nuestro sitio web.


*


Generar páginas con URLs amigables: algunos gestores de contenido generan archivos estáticos cuyas URL no contienen variables dinámicas, mientras que otros emplean direcciones URL con múltiples parámetros dinámicos, como por ejemplo: http://www.midominio.org/portal/site/Equipo /menuitem.6dab26af2ec93c76a68e76b1805101ca/?vgnextoid=88c8c55c1edb7010VgnVCM100000081510acRCRD. Entre éstos últimos, algunos permiten crear URL alias más amigables (conteniendo palabras clave o eliminando los parámetros dinámicos) que después el sistema sustituye internamente por la URL dinámica que precisa. En igualdad de condiciones, elijamos un CMS que genere direcciones URL ricas en palabras clave o con un reducido número de parámetros dinámicos. Direcciones URL como la del ejemplo son muy poco usables así como poco amigables para los buscadores.


*


Limitar el nivel de subdirectorios: los buscadores dan mayor importancia a una página cuanto más cerca está de la página home del portal. Es por esto que debemos limitar el número de subdirectorios que muestra la URL: muchos gestores de contenidos permiten organizar jerárquicamente el contenido independientemente de la localización física de los archivos en el servidor, presentando URLs mucho más sencillas que la estructura real del directorio correspondiente. Por ejemplo, la URL http://www.midominio.com/Viajes/Destinos/Ciudades/MasInfo/Datos Generales/Congresos/Congresos_negocios.htm hace que este contenido esté situado seis niveles de profundidad por debajo de la página home.


*


Conectar el control de validación de enlaces del CMS: la mayoría de gestores controla la publicación de enlaces rotos que apuntan a contenidos controlados por el propio gestor, pero pocos validan que un enlace que apunta a una web externa no es un enlace roto. Si el control existe, asegurémonos de conectarlo para impedir que un usuario pueda introducir un enlace hacia una página web inexistente.


*


Dejar el control del archivo robots.txt al webmaster: algunos gestores de contenidos permiten editar el contenido del archivo robots.txt por parte del autor de una página. En general, es mejor que sólo el webmaster controle el contenido de este archivo para impedir que, por desconocimiento, un usuario pueda bloquear el rastreo de los robots de una importante parte de la Web.


*


Evitar URLs duplicadas: los buscadores son tremendamente selectivos a la hora de castigar el contenido duplicado de una Web, de modo que debemos asegurarnos de que cada página sólo existe bajo una única URL. En cualquier caso, si queremos que los usuarios puedan llegar a un mismo contenido desde URLs homólogas, es mejor programar redireccionamientos permanentes 301, que no son castigados por los buscadores.


*


Evitar variables de sesión en la URL: si nuestro portal realiza transacciones electrónicas o algún otro proceso que requiera mantener el estado del cliente, es preferible emplear una cookie de sesión que una variable de sesión que aparece en la URL. La razón es que si los buscadores detectan esto, se abstendrán de rastrear la página para evitar indexar como páginas distintas la misma, pero con distinta variable de sesión. Por ejemplo: http://www.midominio.com/index.php?module=Health&action=DefaultIndex&PHPSESSID=98ab41f9acd8c74df4b6e063985bda8d. En esta URL podemos ver que existe un parámetro de identificación de la sesión (PHPSESSID) que, si es detectado por los buscadores, impedirá que la página sea rastreada, ya que sucesivas visitas del buscador archivarían como páginas distintas ésta misma, en la que únicamente cambiaría el valor del identificativo de sesión. En cualquier caso, se debe restringir el empleo de identificadores de sesión exclusivamente a las áreas del portal en los que sea absolutamente necesario.


*


Reducir el código basura: simplificar el código HTML que emplean las plantillas y optar por usar Hojas de Estilo en Cascada (CSS) en lugar de tablas para maquetar el contenido. El empleo de Hojas de Estilo en Cascada facilita la actualización del diseño de una Web, reduce considerablemente el peso de los archivos (la maquetación viaja una sola vez del servidor al usuario, después está ya disponible en la memoria temporal o caché del navegador para las siguientes páginas visitadas) y da mayor preponderancia al contenido significante de la página respecto al peso total del código de la misma.


*


Seleccionar la opción de texto para la navegación del sitio: evitando siempre que sea posible el uso de menús Javascript o Flash, ya que sus enlaces no pueden ser seguidos por los buscadores. En muchos casos, podremos lograr con el uso de CSS efectos parecidos a los de los menús Javascript o Flash. Si el gestor de contenidos permite crear un rastro de migas de pan (breadcrumb), activémoslo. Mejora la usabilidad del sitio, ayuda a situarse al usuario en el conjunto de la estructura de la web y es un inmejorable atajo para que los buscadores rastreen todo el contenido.


*


No olvidar que existen los encabezamientos: el uso de estilos nos hace olvidar la existencia de etiquetas HTML de jerarquía (H1, H2, H3, etc.) cuyo aspecto visual final podemos modificar también con estilos, pero que ayudan a los buscadores a entender mejor la estructura lógica de la página y señalizan qué aspectos son más importantes. Es por ello importante animar a los editores de contenido a usar encabezamientos en lugar de simplemente definir el texto más grande o más pequeño con font size y, si es posible, limitar a un único encabezamiento de máximo nivel (H1) por página.


*


Exigir la creación de un título único, y la adición de metaetiquetas relevantes: programar el CMS de tal forma que la cumplimentación de título y metaetiquetas sea un requisito para la publicación del contenido y, si es posible, activar un control para comprobar la unicidad del título.


*


Requerir cumplimentar la etiqueta alt al añadir una imagen al contenido. Esta etiqueta permite a los buscadores indexar mejor las imágenes, colabora en la relevancia de los términos clave de la página y mejora la accesibilidad a los contenidos por parte de las personas con problemas de visión.


*


Implementar controles para evitar la publicación de contenido duplicado.


*


Animar a usar textos descriptivos en enlaces: en lugar de "Haga click aquí", emplear "Más información sobre nuestro servicio de asistencia al cliente 24H".





Lo mejor de ambos mundos


Es evidente, pues, que si al implementar un gestor de contenidos para generar y mantener el contenido de un gran portal se tienen en cuenta los aspectos relacionados con la optimización web y el posicionamiento en buscadores de dicho portal podemos animar o, de alguna forma, imponer una cierta disciplina a través del propio sistema CMS que implique a los editores de contenido a crear páginas fácilmente rastreables e indexables, que puedan competir adecuadamente en los buscadores.


Las grandes empresas cuentan con la materia prima favorita de los buscadores: contenido abundante, original, dinámico y de rápida actualización. Aprovechemos toda la capacidad de los gestores de contenidos para extraer el máximo rendimiento de la inversión que efectúan en su presencia en la Red.

http://www.articuloz.com/marketing-en-internet-articulos/como-aprovechar-su-gestor-de-contenidos-para-tener-una-web-bien-posicionada-en-buscadores-216344.html

domingo, 10 de octubre de 2010

IGLC

Importante reunión que se llevara a cabo este año en Perú, de Leading Construction .