Powrót do strony głównej

mod_rewrite dla Nginx: .htaccess w CMS

Moduł nginx-mod-rewrite emuluje .htaccess Apache w Nginx dla CMS. Obsługuje reguły mod_rewrite, fallback do index.php i buforowanie. Benchmarki pokazują wydajność bliską natywnemu Nginx. Przykłady budowania i konfiguracji dla RHEL/Debian.

Nginx + .htaccess: moduł mod_rewrite dla CMS
Advertisement 728x90

Moduł mod_rewrite dla Nginx: obsługa .htaccess w systemach CMS

Nginx nie obsługuje plików .htaccess z Apache, co utrudnia migrację stron na popularne systemy CMS, takie jak WordPress, Drupal czy Grav. Te systemy opierają się na mod_rewrite do obsługi przyjaznych URL-i (SEO), ochrony katalogów i zarządzania błędami. Bez .htaccess CMS mogą zwracać błąd 404 lub wymagać połączenia Nginx + Apache, co zwiększa obciążenie.

Opracowano moduł nginx-mod-rewrite, który emuluje mod_rewrite. Analizuje on .htaccess w locie, stosując reguły rewrite, w tym wewnętrzne przekierowania i fallback do index.php. Moduł działa na poziomach server, location i .htaccess, minimalizując odczyty pliku dzięki buforowaniu w puli żądań.

Podejścia do rozwiązania w panelach zarządzania

Panele kontrolne, takie jak HestiaCP, rozwiązują problem na dwa sposoby:

Google AdInline article slot
  • try_files $uri $uri/ index.php?$args — obejmuje 50–80% przypadków, ale nie wszystkie reguły mod_rewrite.
  • Szablony ngx_http_rewrite_module — pełny odpowiednik .htaccess dla konkretnego CMS, ale sztywno wiążą konfigurację z platformą.

Moduł nginx-mod-rewrite eliminuje ograniczenia: obsługuje RewriteMap (w minimalnym zakresie), RewriteOptions, nie wymaga szablonów i umożliwia edycję .htaccess bez uprawnień administratora serwera.

Kompilacja i instalacja modułu

Kompilacja jest możliwa na hoście lub w Dockerze. Dla Almalinux 9:

  • Zainstaluj Docker.
  • Sklonuj repozytorium.
  • Wykonaj bash package_preparer.sh prepare "almalinux:9".

Wynik to pakiety RPM w tmpbuild/:

Google AdInline article slot
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

Analogicznie dla Debiana — pakiety DEB.

Konfiguracja serwera

Przykład bloku server dla strony z 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 aktywuje analizę .htaccess. Pliki statyczne są wyłączone z przetwarzania rewrite dla wydajności.

Google AdInline article slot

Testy wydajności

Testy na Drupal (wrk, 30 sekund):

| Scenariusz | 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 (statyczny) | 7384.25 req/s | 4591.31 req/s | 2007.70 req/s |

| /user/login (rewrite) | 126.48 req/s | 128.58 req/s | 117.78 req/s |

Moduł jest zbliżony do czystego Nginx pod względem prędkości, przewyższa połączenie z Apache. Obsługa plików statycznych spowalnia z powodu analizy .htaccess, ale można to zoptymalizować wyjątkami w location.

Co jest ważne

  • Moduł w pełni emuluje mod_rewrite, w tym wewnętrzne przekierowania i buforowanie .htaccess.
  • Obsługa CMS bez szablonów: WordPress, Drupal, Grav działają z natywnymi plikami .htaccess.
  • Wydajność: 90–100% czystego Nginx, bez obciążenia Apache.
  • Kompilacja w RPM/DEB dla RHEL/Debian, obsługa Docker.
  • Ograniczenia: minimalny RewriteMap, uproszczone RewriteOptions (wystarczające dla CMS).

— Editorial Team

Advertisement 728x90

Czytaj dalej