На регулярных выражениях стоит остановиться отдельно — это рабочие лошадки для созданий гибких правил в .htaccess. По своей сути регулярное выражение является шаблоном, с которым сравнивается исходная строка. Ниже список специальных символов и их описание:
- “^” — символ обозначающий начало строки. При создании правил с использованием директив RedirectMatch и RewriteRule, в начале шаблона следует указывать этот символ, для обозначения начала строки.
RewriteRule ^test$ /test2.html
В этом примере строка должна начинаться с “test”. То есть, адрес вида cat/test не будет преобразован, потому что начало строки у него “cat”, а не “test” - “$” — символ обозначающий конец строки. Следует указывать в конце шаблона для обозначения конца строки.
RewriteRule ^test$ /test2.html
В этом примере строка должна заканчиваться на “test”. То есть, адрес test/some_url не будет преобразован, потому что конец строки у него “some_url, а не “test”. - “()” — круглые скобки. Используются для выделения группы символов. Группировка, в том числе необходима для использования обратных RewriteCond и RewriteRule связей.
RewriteRule ^test/(.*).html$ /test2/$1.html
В этом примере в скобах сгруппированы символы находящиеся после /test/ и перед .html. - “.” — точка. Обозначает любой символ.
RewriteRule ^te.t$ /test2.html
В этом примере вместо точки может быть использован любой символ, в том числе и точка. То есть teet -> test2.html или tezt -> test2.html и т.д. - “|” — альтернативный выбор. Например, выражения “A|B” означают “A или B”.
RewriteRule ^te(s|z|r|g)t$ /test2.html [R=301,L]
Символы для выбора следует объединять в группы. В этом примере только с адресов /test, /tezt, /tert и /tegt будет произведен редирект на адрес /test2.html. - “?” — ставится после символа или группы символов. Обозначает, что этот символ (группа) может как присутствовать, так и отсутствовать.
RewriteRule ^tes?t$ /test2.html
“test” или “tet” будут преобразованы в test2.html. То же самое с группами символов в скобках. - “*” — ставится после символа (группы). Обозначает, что символ (группа) может отсутствовать или присутствовать неограниченное число раз подряд.
RewriteRule ^te*st$ /test2.html
tst, test или teeeeeeeeest будут преобразованы в test2.html. То же самое с группами символов в скобках. - “+” — действует аналогично символу “*”, но предшествующий ему символ обязательно должен присутствовать хотя бы один раз.
RewriteRule ^tes+t$ /test2.html
test или tessssssst будут преобразованы в test2.html. То же самое с группами символов в скобках. - “[]” — квадратные скобки. Используются для перечисления допустимых диапазонов символов. Работает аналогично символу “|”, но является более оптимальным вариантом по удобству и быстродействию. Поддерживается указание диапазонов значений. [0-9] — все символы от 0 до 9, [a-z] или [A-Z] — все символы латинского алфавита. Если в в начале скобок стоит символ “^”, это означает перечисление недопустимых символов. [^0-9] — допускаются любые символы кроме цифр.
RewriteRule ^te[a-z]t$ /test2.html
На третьей позиции может находится любой символ латинского алфавита, /teat, /tebt, tect и т.д.
RewriteRule ^te[a-z,0-9]t$ /test2.html
Можно указывать диапазоны значений через запятую. - “{}” — фигурные скобки, указываются после символа, группы символов или диапазона символов. Означает минимальное и максимальное количество символов (групп), которое может присутствовать.
RewriteRule ^(test){1,9}$ /test2 [R=301,L]
В этом примере словосочетание “test” может присутствовать в строке 1 или 9 раз. То есть для /test, /testtest, или /testtesttesttesttesttesttesttesttest будет сработано перенаправление
RewriteRule ^[a-z]{3,5}$ /test2 [R=301,L]
В этом примере перенаправление сработает только для адресов состоящих только из латинских символов и содержащих от 3-х до 5-ти символов. - “\” — обратный слэш. Используется для экранирования спецсимволов, когда нужно использовать их именно как обычный символ, а не как спецсимвол.
RewriteRule ^test.html$ /test2.html
В этом примере перед “.” стоит обратный слеш, соответственно точка будет воспринята именно как точка, а не как любой символ. Если его убрать, вместо точки может быть использован абсолютно любой символ. - “$N” — “N” это число от 0 до 9. Используется для обращения к группам символов из шаблона RewriteRule для последующей подстановки, обратная RewriteRule связь.
RewriteRule ^test/(.*).html$ /test2/$1.html
В этом примере все символы в круглых скобках подставляются вместо $1. /test/some-url -> /test2/some-url - “%N” — “N” это число от 0 до 9. Используется для обращения к группам символов из шаблона RewriteCond для последующей подстановки, обратная RewriteRule связь.
RewriteCond %{QUERY_STRING} ^id=(.*)$
RewriteRule ^(.*)$ /test/%1? [R=301,L]
В этом примере группа символов в директиве RewriteCond будет подставлена вместо %1.