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

r0sk 28.Apr.2009 6 Comentarios 5118 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.

Escribe un comentario

Nick
Email
URL

Buscar

Cargando...

Categorías

Últimos comentarios

  • BartlettLilly20
  • r0sk
  • coder
  • argordmel
  • uveic
  • MarcosBL
  • quemada
  • alexander
  • Hakky111
  • tramel
  • hoyadas
  • hoyadas
  • hoyadas
  • Anubys
  • Arturo

Tagcloud

lugo freebsd seguridad futbol iphone mysql champions userlinux alemania_2006 copa bsd cakephp rfilms deportes meme blogs conciertos bake debian macosx apple humor programación música games 2008 beers tip lucux cake sysadmin ssh ibook films cumpleaños bash league barça soccer mundial frases opinion felicidades hack php juegos cms personal 2007 ubuntu ds mac sidenotes openbsd linux blogsfera rsidenotes blog nintendo san_froilan

Archivo

Social

Twitter

Enlaces

Enlaces de interés