Guía básica del mod_rewrite - Userlinux.net

Hablando de mod_rewrite siempre saltan las dudas, normalmente lo más problemático suelen ser las expresiones regulares así que he decidido reunir en una entrada toda la información que he recolectado sobre el tema. Empiezo por dos cheatsheets que deberían ser un musthave para cualquier sysadmin, aquí las dejo para descarga…

Guía básica del mod_rewrite

28.Apr.2009 ~ 6 Comentarios ~ 7033 Lecturas
Hablando de mod_rewrite siempre saltan las dudas, normalmente lo más problemático suelen ser las expresiones regulares así que he decidido reunir en una entrada toda la información que he recolectado sobre el tema.

Empiezo por dos cheatsheets que deberían ser un musthave para cualquier sysadmin, aquí las dejo para descarga y/o visualización: Nota: Post en actualización constante, se irán tanto agregando nuevos ejemplos como features que se vayan usando.

Sintaxis de expresiones regulares

La regexp syntax tiene 4 ó 5 reglas básicas que son sencillas de entender, vamos a ello:
  • ^.- Comienzo de cadena.
  • $.- Fin de cadena.
  • ..- Cualquier caracter simple.
  • (a|b).- Opcional entre a y b.
  • (...).- Sección de grupo.
  • [abc].- Item en rango (a, b ó c).
  • [^abc].- Negación de item en rango (ni a, ni b, ni c).
  • a?.- Cero ó 1 "a".
  • a*.- Cero o más "a".
  • a+.- Una o más "a".
  • a{3}.- Exactamente 3 "a".
  • a{3,}.- 3 ó más "a".
  • a{3,6}.- De 3 a 6 "a".
  • !(patron).- Aplicar regla cuando la URL no coincida con el patrón.
  • \.- Escapa un caracter especial.

Patrones de condición

  • < condición.- Menor que condición.
  • > condición.- Mayor que condición.
  • = condición.- Igual a condición.
  • -d.- Es directorio.
  • -f.- Es archivo regular.
  • -s.- Es archivo con tamaño mayor de cero.
  • -l.- Es enlace simbólico.
  • -F.- Comprueba si el archivo existe y es accesible vía URL.
  • -U.-Comprueba si la URL existe y es accesible.

RewriteRule flags

  • [NC].- No Case, hace el patrón case insensitive, da igual mayúsculas que minúsculas.
  • [R=code].- Redirecciona a una nueva URL con un código opcional [300-400] para indicar error, redirección...
  • [F].- Forbidden, envía un 403.
  • [L].- Last Rule, trata a la regla como si fuera la última, para el proceso de rewrite en esta linea.
  • [C].- Chain, concatena una regla con la siguiente, si la regla coincide sigue con las concatenadas, si no coincide las salta.
  • [T=mime-type].- Fuerza un mime-type específico "application/x-httpd-cgi" o lo que sea.
  • [NE].- Not Escape output, para no escapar los caracteres raros por urlcode(), por ejemplo si queremos que un espacio siga siendo espacio y no %20%.
  • [S=x].- Skip, se salta las siguientes x reglas.
  • [E=var:value].- Enviroment, crea una variable de entorno var con el valor value.

Variables de servidor

  • %{NAME_OF_VAR}.- Para referirnos a una variable cualquiera, creada por ejemplo con la opción [E=var:val] vista antes.
  • %{HTTP_USER_AGENT}
  • %{HTTP_REFERER}
  • %{HTTP_COOKIE}
  • %{HTTP_FORWARDED}
  • %{HTTP_HOST}
  • %{HTTP_PROXY_CONNECTION}
  • %{HTTP_ACCEPT}
  • %{REMOTE_ADDR}
  • %{REMOTE_HOST}
  • %{REMOTE_USER}
  • %{REMOTE_IDENT}
  • %{REQUEST_METHOD}
  • %{SCRIPT_FILENAME}
  • %{PATH_INFO}
  • %{QUERY_STRING}
  • %{AUTH_TYPE}
  • %{DOCUMENT_ROOT}
  • %{SERVER_ADMIN}
  • %{SERVER_NAME}
  • %{SERVER_ADDR}
  • %{SERVER_PORT}
  • %{SERVER_PROTOCOL}
  • %{SERVER_SOFTWARE}
  • %{TIME_YEAR}
  • %{TIME_MON}
  • %{TIME_DAY}
  • %{TIME_MIN}
  • %{TIME_SEC}
  • %{TIME_WDAY}
  • %{TIME}
  • %{API_VERSION}
  • %{THE_REQUEST}
  • %{REQUEST_URI}
  • %{REQUEST_FILENAME}
  • %{IS_SUBREQ}

Directivas

  • RewriteEngine
  • RewriteOptions
  • RewriteLog
  • RewriteLogLevel
  • RewriteLock
  • RewriteMap
  • RewriteBase
  • RewriteCond
  • RewriteRule

Ejemplos

Se irán agregando más ejemplos según vayan apareciendo casos curiosos:
  • Redirigir un dominio a otro (301):
RewriteCond   %{HTTP_HOST}   ^www.domain.com$   [NC]
RewriteRule   ^(.*)$   http://www.domain2.com/$1   [R=301,L]
  • Varios ejemplos:
RewriteRule   ^page.html$   new_page.html   [R,NC,L]
RewriteRule   ^([A-Za-z0-9-]+)/?$   categories.php?name=$1 [L]
RewriteRule   ^articles/([A-Za-z0-9-]+)/([0-9]+)/?$ article.php?name=$1&page=$2 [L]
  • Parando el spam de weight y drugs, por ejemplo:
RewriteCond  %{HTTP_REFERRER}  (weight)  [NC,OR]
RewriteCond  %{HTTP_REFERRER}  (drugs)  [NC]
RewriteRule  .*  -  [F]
  • Redirigir un dominio a otro directorio:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.domain.com$
RewriteCond %{REQUEST_URI} !^/HTML2/
RewriteRule ^(.*)$ /HTML2/$1

Recursos

Comentarios


gravatar
pAvL0
30.Apr.2009
ahi queda eso...jeje

te dejo aqi un apunte que me parece interesante...

http://stackoverflow.com/questions/505338/get-and-url-rewriting-for-php

Ale...Salu2

gravatar
01.May.2009
Vaya hombre qué bien me viene, que con Debian no he conseguido hacer funcionar bien el rewrite...

gravatar
Erik
30.Jul.2009
Estimado:

Muy bueno tu articulo y aclara un monton de dudas con las que me he topada en algunos ejemplos a lo largo de mi investigación de modrewrite, como las banderas (flags) no tenia idea para que servian. En un nuevo proyecto de modrewrite me vi en la necesidad de utilizar las variables que son enviadas por los formularios, y me encontre con la \\\"solución\\\" QUERY_STRING, pero no he tenido resultados favorables. Cuando utilizo las otras variables me refleja el resultado, pero la que necesito no me arroja nada.
Sera necesario activar alguna otra directiva o utilizarla de alguna forma en particular???
El uso que le di fue muy basico:
RewriteRule ^/buscador.html$ /buscador.php?%{QUERY_STRING}

Podrias darme algun consejo???
Gracias

gravatar
Tu nombre
26.Nov.2009
g>hher yerong> adfdf

gravatar
27.Nov.2009
aguante el pro

gravatar
e|ektra
17.Aug.2010
Y para hacer que toda la URL se pase a HTTPS?? Pongamos que la URL cambia para cada usuario y tiene que pasarse literalmente a HTTPS, por lo que con un redirect permanent no me vale y no lo acabo de ver cómo hacerlo con regex.

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • reidrac
  • r0sk
  • Rodrigo Rega
  • minWi
  • r0sk
  • reidrac
  • r0sk
  • deady
  • errece
  • r0sk
  • flexo
  • r0sk
  • MarcosBL
  • r0sk
  • isra

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

ubuntu juegos 2007 web twitt futbol cumpleaños ds django mundial apple rfilms conciertos alemania_2006 lugo macosx programación frases mercurial lucux php userlinux debian blog rsidenotes twitter felicidades cakephp meme ssh bsd barça sidenotes iphone bash vacaciones blogs opinion blogsfera seguridad linux champions humor freebsd personal mysql nintendo openbsd canción sysadmin bake games ps3 2008 cake deportes hack films mac league

Archivo

Social

Enlaces de interés