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
5 Comentarios
te dejo aqi un apunte que me parece interesante...
http://stackoverflow.com/questions/505338/get-and-url-rewriting-for-php
Ale...Salu2
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