Modul mod_rewrite pro Nginx: podpora .htaccess v CMS
Nginx nepodporuje .htaccess z Apache, což způsobuje potíže při migraci webů na populární CMS jako WordPress, Drupal nebo Grav. Tyto systémy spoléhají na mod_rewrite pro SEO-URL, ochranu adresářů a zpracování chyb. Bez .htaccess CMS buď vrací 404, nebo vyžadují Nginx + Apache, což přidává režii.
Byl vyvinut modul nginx-mod-rewrite, který emuluje mod_rewrite. Parsuje .htaccess za běhu, aplikuje pravidla rewrite, včetně interních přesměrování a fallbacku na index.php. Modul funguje na úrovních server, location a .htaccess, minimalizuje čtení souboru díky ukládání do mezipaměti v rámci požadavku.
Přístupy k řešení v ovládacích panelech
Ovládací panely jako HestiaCP řeší problém dvěma způsoby:
try_files $uri $uri/ index.php?$args— pokrývá 50–80 % případů, ale ne všechna pravidla mod_rewrite.- Šablony ngx_http_rewrite_module — plný ekvivalent .htaccess pro konkrétní CMS, ale pevně vážou konfiguraci k platformě.
Modul nginx-mod-rewrite odstraňuje omezení: podporuje RewriteMap (minimálně), RewriteOptions, nevyžaduje šablony a umožňuje upravovat .htaccess bez administrátorských práv na serveru.
Sestavení a instalace modulu
Sestavení je možné na hostiteli nebo v Dockeru. Pro Almalinux 9:
- Nainstalujte Docker.
- Naklonujte repozitář.
- Spusťte
bash package_preparer.sh prepare "almalinux:9".
Výsledkem jsou RPM balíčky v 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
Podobně pro Debian — DEB balíčky.
Konfigurace serveru
Příklad server-bloku pro web s 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 aktivuje parsování .htaccess. Statické soubory jsou vyloučeny z rewrite zpracování pro výkon.
Benchmarky výkonu
Testy na Drupal (wrk, 30 sekund):
| Scénář | Nginx + php-fpm | Nginx + mod_rewrite | Nginx + Apache + php-fpm |
|---------------------------|-----------------|--------------------|---------------------------|
| / (fallback index.php) | 129,74 pož/s | 125,94 pož/s | 121,31 pož/s |
| /robots.txt (statický) | 7384,25 pož/s | 4591,31 pož/s | 2007,70 pož/s |
| /user/login (rewrite) | 126,48 pož/s | 128,58 pož/s | 117,78 pož/s |
Modul je blízký čistému Nginxu v rychlosti, překonává kombinaci s Apache. Statika se zpomaluje kvůli parsování .htaccess, ale optimalizuje se výjimkami v location.
Co je důležité
- Modul plně emuluje mod_rewrite, včetně interních přesměrování a ukládání .htaccess do mezipaměti.
- Podpora CMS bez šablon: WordPress, Drupal, Grav fungují s původními .htaccess.
- Výkon: 90–100 % oproti čistému Nginxu, bez režie Apache.
- Sestavení v RPM/DEB pro RHEL/Debian, podpora Dockeru.
- Omezení: minimální RewriteMap, zjednodušené RewriteOptions (dostačující pro CMS).
— Editorial Team
Zatím žádné komentáře.