Htaccess – jeden RewriteCond

Czasem potrzebujemy wdrożyć wiele reguł RewriteRule, gdzie każda z nich jest poprzedzona regułą warunkową RewriteCond, czyli nasz .htaccess wydłuża się o podwójną ilość linii – a gdyby tak użyć tylko jednej reguły RewriteCond?

Od razu zaznaczę, że nie jest to wcale bezpieczniejsze ani wygodniejsze rozwiązanie (jeśli chcemy coś zmieniać w przyszłości), jednak otwiera przed nami pewne nowe możliwości 😉

Jeden, by nimi władać, Jeden, by je znaleźć,
Jeden, by je zgromadzić i wszystkie związać

fragment Wiersza o Pierścieniu

S jak „Skip”

Reguły mogą być zakończone jedną lub wieloma flagami, które przekazują dodatkowe instrukcje do parsera. Jedną z nich jest [S], czyli „pomiń” (ang. skip), gdzie po mnemoniku podajemy ilość reguł do pominięcia, np. [S=5].

Hola hola! Przecież nie chcemy nic pomijać, wręcz przeciwnie!

Racja. Dlatego możemy pominąć kolejne reguły, jeśli nie spełniają warunku w RewriteCond, poprzedzając wyrażenie znakiem wykrzyknika „!”:

RewriteCond %{QUERY_STRING} !kolor=przezroczysty
RewriteRule .? - [S=3]
RewriteRule ^opakowanie-1$ /opakowanie-1 [R=301,QSD]
RewriteRule ^opakowanie-5$ /opakowanie-5 [R=301,QSD]
RewriteRule ^opakowanie-10$ /opakowanie-10 [R=301,QSD]

Powyższe 3 reguły przekierowujące na wersję adresu bez parametrów (porzuconych przy pomocy flagi QSD, ang. query string discard) zadziałają tylko wtedy, gdy parametr „kolor=przezroczysty” będzie obecny w URL. W taki sposób, używając zaprzeczenia, możemy wykonywać interesujące nas zestawy reguł.

Tak jak pisałem, nie jest to bezpieczne ani wygodne rozwiązanie. Musimy znać ilość reguł, które mają zostać wzięte pod uwagę. Czyli w przypadku popełnienia prostego błędu jakim jest podanie zbyt dużej wartości, możemy otrzymać bombę z opóźnionym zapłonem. Coś takiego nie wyrzuci od razu np. błędu 500, tylko wyłączy jakąś regułę z kolei. To samo, jeśli np. usuniemy/dodamy kolejne reguły do tej „grupy” – musimy pamiętać o aktualizacji flagi [S]. Warto grupować takie reguły używając jasnych komentarzy przed i po zestawie reguł.