Синтаксис и регулярные выражения .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.
Комментарии (0)

Нет комментариев. Ваш будет первым!

Добавить комментарий
© 2012-2017 Hostgid.net. Все права защищены.