Módulo Nginx mod_rewrite: Soporte de .htaccess para CMS
Nginx no soporta .htaccess de Apache, lo que genera desafíos al migrar sitios web a plataformas CMS populares como WordPress, Drupal o Grav. Estos sistemas dependen de mod_rewrite para URLs amigables para SEO, protección de directorios y manejo de errores. Sin .htaccess, los CMS devuelven errores 404 o requieren configuraciones Nginx + Apache, añadiendo sobrecarga.
Se ha desarrollado un módulo llamado nginx-mod-rewrite para emular mod_rewrite. Analiza .htaccess al vuelo, aplicando reglas de reescritura, incluyendo redirecciones internas y fallback a index.php. El módulo opera a nivel de servidor, ubicación y .htaccess, minimizando lecturas de archivos mediante caché en el pool de solicitudes.
Enfoques de solución en paneles de control
Paneles de control como HestiaCP abordan el problema de dos formas:
try_files $uri $uri/ index.php?$args— cubre 50–80% de los casos pero no todas las reglas de mod_rewrite.- Plantillas ngx_http_rewrite_module — un equivalente completo de .htaccess para CMS específicos, pero vinculan estrechamente la configuración a la plataforma.
El módulo nginx-mod-rewrite elimina estas limitaciones: soporta RewriteMap (mínimamente), RewriteOptions, no requiere plantillas y permite editar .htaccess sin privilegios de administrador del servidor.
Construcción e instalación del módulo
La construcción es posible en el host o en Docker. Para Almalinux 9:
- Instala Docker.
- Clona el repositorio.
- Ejecuta
bash package_preparer.sh prepare "almalinux:9".
El resultado son paquetes RPM en tmpbuild/:
tmpbuild/nginx-mod-rewrite-0.1-1.el9.src.rpm
tmpbuild/nginx-mod-rewrite-0.1-1.el9.x86_64.rpm
tmpbuild/nginx-mod-rewrite-debuginfo-0.1-1.el9.x86_64.rpm
tmpbuild/nginx-mod-rewrite-debugsource-0.1-1.el9.x86_64.rpm
Similar para Debian — paquetes DEB.
Configuración del servidor
Ejemplo de bloque de servidor para un sitio CMS:
server {
listen 127.0.0.1:80;
server_name test.my.brp www.test.my.brp;
root /home/test/web/test.my.brp/public_html;
index index.php index.html index.htm;
HtaccessEnable on;
location ~ /\.(?!well-known\/) {
deny all;
return 404;
}
location ~* ^.+\.(jpeg|jpg|png|webp|gif|bmp|ico|svg|css|js|txt)$ {
expires max;
fastcgi_hide_header "Set-Cookie";
}
location / {
RewriteEngine On;
location ~ [^/]\.php(/|$) {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php74-fpm.sock;
}
}
}
HtaccessEnable on activa el análisis de .htaccess. Los archivos estáticos se excluyen del procesamiento de reescritura para rendimiento.
Pruebas de rendimiento
Pruebas en Drupal (wrk, 30 segundos):
| Escenario | Nginx + php-fpm | Nginx + mod_rewrite | Nginx + Apache + php-fpm |
|---------------------------|-----------------|--------------------|---------------------------|
| / (fallback index.php) | 129.74 req/s | 125.94 req/s | 121.31 req/s |
| /robots.txt (estático) | 7384.25 req/s | 4591.31 req/s | 2007.70 req/s |
| /user/login (reescritura) | 126.48 req/s | 128.58 req/s | 117.78 req/s |
El módulo es cercano en velocidad a Nginx puro y supera la combinación con Apache. El contenido estático se ralentiza debido al análisis de .htaccess pero se optimiza con exclusiones de ubicación.
Puntos clave
- El módulo emula completamente mod_rewrite, incluyendo redirecciones internas y caché de .htaccess.
- Soporte CMS sin plantillas: WordPress, Drupal, Grav funcionan con .htaccess nativo.
- Rendimiento: 90–100% de Nginx puro, sin sobrecarga de Apache.
- Se construye en RPM/DEB para RHEL/Debian, con soporte Docker.
- Limitaciones: RewriteMap mínimo, RewriteOptions simplificado (suficiente para CMS).
— Editorial Team
Aún no hay comentarios.