Expresiones Regulares Comunes en Nginx
| Carácter | Significado y Ejemplo |
|---|---|
| ^ | Coincide con el inicio de la cadena de entrada. |
| $ | Coincide con el final de la cadena de entrada. |
| \* | Coincide con cero o más repeticiones del carácter anterior. Ejemplo: ol\* coincide con o, ol, oll. |
| + | Coincide con una o más repeticiones del carácter anterior. Ejemplo: ol+ coincide con ol, oll, pero no con o. |
| ? | Coincide con cero o una repetición del carácter anterior. Ejemplo: do(es)? coincide con do o does. |
| . | Coincide con cualquier carácter excepto \n. Para incluir \n, use patrones como [.\n]. |
| \\ | Marca el siguiente carácter como especial, literal o una referencia posterior. Ejemplo: \n coincide con un salto de línea, \\$ coincide con $. |
| \d | Coincide con cualquier dígito numérico. |
| \s | Coincide con un espacio en blanco (espacio o tabulación). |
| {n} | Repite la coincidencia exactamente n veces. |
| {n,} | Repite la coincidencia n o más veces. |
| {n,m} | Repite la coincidencia entre n y m veces. |
| [ ] | Define un rango de caracteres para la coincidencia. |
| [c] | Coincide con el carácter c. |
| [a-z] | Coincide con cualquier letra minúscula de la a a la z. |
| [a-zA-Z0-9] | Coincide con cualquier letra (mayúscula o minúscula) o dígito. |
| ( ) | Define el inicio y fin de un grupo de captura. |
| | | Operador OR lógico. |
Enrutamiento con Directivas location
Las directivas location en Nginx definen cómo el servidor debe manejar las solicitudes entrantes basándose en la URI. Se clasifican en tres tipos fundamentales.
Tipos de Coincidencia
- Coincidencia exacta (
=): La URI debe coincidir exactamente con el patrón.location = /recurso {} - Coincidencia de prefijo: Busca que la URI comience con el patrón. Es el método por defecto.
location /prefijo/ {} - Coincidencia regular (
~o~\*): Utiliza expresiones regulares para la coincidencia.~distingue mayúsculas,~\*no.
Operadores y Jerarquía de Prioridad
El motor de Nginx evalúa las directivas location en un orden de prioridad específico:
- Coincidencia exacta (
=): Tiene la prioridad más alta. Si se encuentra, se usa inmediatamente. - Coincidencia de prefijo con
^~: Si coincide, se detiene la búsqueda de expresiones regulares. - Expresiones regulares (
~y~\*): Se evalúan en el orden en que aparecen en el archivo de configuración. La primera coincidencia gana. - Coincidencia de prefijo sin modificador: Se evalúan todas las coincidencias de prefijo. La más larga es seleccionada.
Ejemplos de Configuración Práctica
A continuación se presentan patrones comunes para la configuración de location en servidores web reales.
Regla para la Página Principal
location = / {
proxy_pass http://backend_app_server/;
}
Regla para Contenido Estático
location ^~ /recursos/ {
alias /ruta/absoluta/recursos/;
}
location ~* \.(ico|png|jpg|jpeg|gif|css|js|woff2?)$ {
root /var/www/estatico/;
}
Regla General (Proxy a Aplicación)
location / {
proxy_pass http://backend_app_server;
include proxy_params;
}
Reescritura de URLs con rewrite
La directiva rewrite permite modificar la URI de la solicitud, redirigir a otra ubicación o responder con un código de estado específico. Sintaxis básica: rewrite <patrón_regex> <reemplazo> [marca];
Orden de Ejecución
- Se ejecutan las directivas
rewritedentro del bloqueserver. - Se realiza la coincidencia de
location. - Se ejecutan las directivas
rewritedentro del bloquelocationseleccionado.
Marcas (Flags) de Reescritura
last: Detiene el procesamiento actual de directivasrewritey busca un nuevolocationcon la URI resultante.break: Detiene el procesamiento de directivasrewriteen el bloque actual.redirect: Devuelve una redirección temporal (302).permanent: Devuelve una redirección permanente (301).
Ejemplos de Configuración con rewrite
Redirección por Nombre de Dominio
Redirigir todo el tráfico de un dominio obsoleto a uno nuevo, preservando la ruta.
server {
listen 80;
server_name antiguo.ejemplo.com;
return 301 $scheme://nuevo.ejemplo.com$request_uri;
}
Redirección por Dirección IP
Mostrar una página de mantenimiento a todos los visitantes excepto a una IP de administración.
server {
listen 80;
server_name www.ejemplo.com;
set $redireccion_mant true;
if ($remote_addr = "203.0.113.10") {
set $redireccion_mant false;
}
if ($redireccion_mant = true) {
rewrite ^(.*)$ /mantenimiento.html break;
}
location /mantenimiento.html {
root /var/www/html;
internal;
}
location / {
root /var/www/www.ejemplo.com;
}
}
Redirección con Cambio de Dominio y Ruta
Redirigir solicitudes de un subdominio a una ruta específica en el dominio principal.
server {
listen 80;
server_name foro.ejemplo.com;
location /discusion {
rewrite ^/discusion(.*)$ http://www.ejemplo.com/comunidad$1 permanent;
}
location / {
return 404;
}
}
Redirección Basada en Parámetros de Consulta
Redirigir solicitudes que coincidan con un patrón específico en los parámetros.
server {
listen 80;
server_name api.ejemplo.com;
if ($args ~ "version=1&accion=obtener") {
rewrite ^/$ http://api.ejemplo.com/v2/obtener? permanent;
}
location / {
proxy_pass http://api_backend;
}
}
Redirección para Extensiones de Archivo Específicas
Rediriigr solicitudes de archivos PHP en un directorio determinado a la página principal.
server {
listen 80;
server_name www.ejemplo.com;
location ~* /scripts/.*\.php$ {
rewrite ^(.*)$ / permanent;
}
location / {
root /var/www/www.ejemplo.com;
index index.html;
}
}
Redirección para una URL Específica
Redirigir una URL concreta a la página principal del sitio.
server {
listen 80;
server_name www.ejemplo.com;
location = /recursos/legado/pagina-especial.html {
rewrite ^(.*)$ / permanent;
}
location / {
root /var/www/www.ejemplo.com;
}
}