Синтаксис и регулярные выражения .htaccess

Для создания правил в .htaccess, в частности при использовании RewriteRule, RewriteCond или RedirectMatch, используется специальный синтаксис и регулярные выражение. Для многих это темный лес, хотя сложного в этом ничего нет. Под синтаксисом подразумевается использование специальных символов, которые имеют особое значение.
На регулярных выражениях стоит остановиться отдельно — это рабочие лошадки для созданий гибких правил в .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.

Понравилась статья? Поделиться с друзьями: