Синтаксис на htaccess, пълно ръководство - Дмитрий Лео - Съвети за уеб администратор
Метазнаци
Използва се за указване на групи от знаци или "етикети" в шаблон. Например маркери за начало или край на ред.
\ | Наклонена черта "Escape". Следващият символ след него се счита за нормален, а не за специален знак. Символът \ се поставя преди специални знаци, ако са необходими в оригиналната им форма. Например изразът "jpe\+g" съвпада само с един низ "jpe+g". |
^ | Символът ^ отбелязва началото на ред. |
$ | Символът $ отбелязва края на реда. |
! | Отрицателен символ. |
. | Символ . обозначава произволен знак (с изключение на знака за край на реда). |
.* | Заменя абсолютно всеки набор от знаци |
".*" | Намира всички поднизове между кавички |
Символът показва алтернатива. Например, изразите "AB" и "(ABCDEF)" означават съответно "A или B" и "ABC или DEF". | |
() | Скобите () се използват за маркиране на групи от знаци. |
[. ] | Квадратните скоби [] се използват за изброяване на валидни знаци. Например изразът "[abc]" е еквивалентен на израза "abc", но версията в скоби обикновено е по-бърза. Диапазоните могат да се използват вътре в скоби: например изразът "[0-9]" е еквивалентен на израза "[0123456789]". |
[^. ] | Обърнатият клас символи. Ако знаците в квадратните скоби започват с ^, това означава всеки знак, различен от посочените в скобите. Например изразът "[^0-9]+" означава низ от всякакви знаци, различни от числа. |
[. ]* | Например, [abc]* - командата ще намери последователни знаци от посочения набор.[^abc]* - точно обратното. |
\w | Буква, цифра или долна черта _. |
\д | Заменя произволно число. |
\Д | Замества произволен знак, но не и число. |
[0-9] | Заменя произволно число. |
[a-z] | Всяка буква от a до z (целия набор от латински знаци) с малки букви. |
[A-Z] | Всяка буква от А до Я в ГЛАВЕН регистър. |
[a-zA-Z] | Всяка буква от а до я във всеки случай. [a-Z] - същото. |
Модификатори
Модификаторите се използват след обикновени, специални знаци или техните групи и ви позволяват да разширите възможностите на шаблоните за задействане на правила.
? | Символът се повтаря 0 или 1 пъти. символ ? се поставя след знак (или група от знаци), който може да присъства или да не присъства. Например изразът "jpe?g" ще съответства както на низа "jpg", така и на низа "jpeg". |
* | Повтаря се от 0 до 65536 пъти. Символът * се поставя след знак (или група от знаци), който може да липсва или да присъства неограничен брой пъти подред. Например изразът "jpe*g" ще съответства на низовете "jpg", "jpeg" и "jpeeeeeeg". |
+ | Повтаря се от 1 до 65536 пъти. Символът + действа подобно на символа *, с единствената разлика, че знакът пред него трябва да присъства поне веднъж. Например изразът "jpe+g" ще съответства на низовете "jpeg" и "jpeeeeg", но не и на "jpg". |
Точно n пъти. | |
От n до 65536 пъти включително. | |
От n до m пъти включително. |
Всеки ред, който започва с думата stena. Ред, започващ с думата dom-stena, няма да отговаря на критериите.
Всякакви линиизавършващ с набора знаци stena. Ред, завършващ със stena-dom, няма да бъде избран.
Всеки знак се повтаря произволен брой пъти. Критериите ще включват всички редове.
Изберете произволен низ и го запазете като променлива $1 за по-късна употреба.
Изберете всички низове, завършващи с 1 до 6 цифри от диапазона 0 до 9.
Разделете низа на две части: преди наклонената черта и след нея, частите от низа ще бъдат налични в променливите $1 и $2.
важно! Тъй като модификаторът е алчен, първата група ще включва максималния брой знаци, които отговарят на шаблона. Наклонената черта е също толкова символ, колкото всеки друг.
RewriteRule ^(. + )/(. + )$ / ? a=$1&b=$2 [R = 301, L]
http://www.site.com /1/2/3/4/5 → http://www.site.com / ? a=1/2/3/4&b=5
Флаговете са допълнителни опции. Изброени в квадратни скоби, разделени със запетаи, да речем [NC] или [R=301,L].
Следните проверки могат да се използват при условия:
1. Можете да поставите пред шаблона „!“, за да укажете, че шаблонът не съвпада.
2. Можете да извършите лексикографско сравнение на низове:
= Състояние | Лексикографски по-голямо или равно на |
3. Сравнение като цели числа:
-екв | Числено равно |
-ge | Числено по-голямо или равно |
-gt | Числено повече |
-le | Числено по-малко или равно. За да избегнете объркване с главна буква -l използвайте -L |
- lt | Числено по-малко. За да избегнете объркване с главна буква -l използвайте -L |
4. Тествайте различни файлови атрибути:
-д | Е директория. |
-f | Далиобикновен файл. |
-Ф | Файлът съществува ли. |
-л | Това е символна връзка. |
-Л | Това е символна връзка. Подобно на флага -l. |
-с | Това е обикновен файл с ненулев размер |
-U | Дали дадения URL съществува |
-х | Дали файлът е изпълним. |
5. Всички тези отметки могат също да бъдат с префикс с удивителен знак ('!'), за да се обърне значението им.
Променливи
Логика за изпълнение на правило (RewriteRule)
Изпълнението на правило предполага следните действия: на първо място, механизмът за преобразуване търси допълнителни условия за това правило (директиви RewriteCond). Не забравяйте, че поради исторически причини, допълнителни условия се поставят преди правилата (RewriteRule). Ако няма допълнителни условия за това правило, тогава машината за трансформация глупаво извършва трансформацията на текущия URL адрес, посочен в правилото, и преминава към следващото правило. Въпреки това, ако изпълнимо правило (RewriteRule) има допълнителни условия, посочени ПРЕДИ НЕГО в директивите RewriteCond, тогава се изпълнява вътрешен цикъл за обработка на тези допълнителни условия в реда, в който са изброени, отгоре надолу.
Ако поне едно от допълнителните условия, налични за правилото, НЕ е изпълнено, това ще спре текущия процес на изпълнение на правилото и трансформацията на URL адреса, посочен в правилото, НЯМА да бъде извършена. За да може стартираното за изпълнение правило да се изпълни докрай и да смени URL-а е необходимо ВСИЧКИ допълнителни условия посочени в директивите RewriteCond преди това правило да бъдат изпълнени!
Тук е необходимо да се изясни допълнително, че директивитеRewriteCond по подразбиране се комбинират с оператора И в едно съставно условие. Просто този (AND) оператор не е написан по подразбиране. От тук и такава логика, че е необходимо всички допълнителни условия да са верни (защото се комбинират чрез И) за успешното завършване на преобразуването на URL. Директивите RewriteCond обаче могат да се комбинират с условие OR с помощта на флагове (вижте синтаксиса на директивата). Трябва да запомните това, когато задавате допълнителни условия.
Синтаксис на директивата RewriteRule:
1. RewriteRule е името на директивата - правилото. 2. Шаблонът е само условието, чието изпълнение задейства изпълнението на правилото. Това условие - Pattern е perl съвместим регулярен израз, който се прилага към текущия URL адрес. 3. Заместването е точно този алгоритъм за промяна на URL адреса, т.е. правило за промяна (трансформиране) на URL. 4. [ Флагове ] замествания - Третият аргумент на директивата RewriteRule. Флаговете са разделени със запетая, специални символи с главни букви, затворени в квадратни скоби. Флаговете допълват URL трансформацията.
Параметрите в правилото се записват на един ред, започвайки с името на директивата и разделени един от друг с интервал.
Сега нека да разгледаме пример за RewriteRule:
1. ^(.*)$ е модел, регулярен израз, който ще бъде приложен към текущия URL адрес. Тези, които са запознати с регулярните изрази, могат да го прочетат по следния начин: търсене в текущия ред на URL адреса от началото на реда (знак ^) до края на реда (знак $) за произволен знак (знак .) в количество от нула до безкрайност (знак *). Тъй като има скоби () в този RV, тогава частта от URL адреса, която ще съответства на условието в скоби, ще бъде уловена в заместващата променлива $1, която след това можем да използваме в Substitution или в CompareString (това е в директивата RewriteCond, за негоПо-долу). 2. index.php?/$1 - Заместването всъщност е правилото за преобразуване на URL. Записът index.php?/$1 означава, че низът на новия, конвертиран URL адрес трябва да бъде съставен от две части, където първата част от низа е постоянната стойност на index.php?/, а втората част от низа е стойността от заместващата променлива $1. Тук помним, че $1 съхранява частта от URL адреса, която съответства на RE в скоби от параметъра Template. В резултат на това получаваме преобразуван URL във формата index.php?/URL_по който осъществихме достъп. С други думи, всички заявки се пренасочват вътрешно към файла index.php. 3. [ L,QSA ] – флагове, където 'lastL' е последното правило, което означава спиране на процеса на преобразуване в този момент и не прилагане на други правила за преобразуване към URL адреса. 'qsappendQSA' - добавяне на низ на заявка - Този флаг казва на машината за трансформация да добави, вместо да замени, низ на заявка от URL към съществуващ в низа за заместване. Използвайте това, когато искате да добавите допълнителни данни към низа на заявката, като използвате директиви за трансформация.
mod_rewrite мамят лист
Cheat sheet mod_rewrite съдържа списък с флагове за директивите RewriteRule и RewriteCond, списък със сървърни променливи, ръководство за регулярни изрази и някои примери за общи правила.
Лист за измама с регулярен израз
Cheat sheet е общо ръководство за моделите на регулярни изрази без оглед на спецификата на всеки език.
Заключение
Не забравяйте да екранирате служебните знаци в регулярния израз. Понякога те забравят да избягат от точката, когато тя трябва да действа точно като точка, а не както е обичайно в регулярен израз - като всеки символ.
Също така не забравяйте да увиете целия блокправила за mod_rewrite към етикет:
Не пишете твърде много директивиmod_rewrite, пишете само правилата за преобразуване, от които наистина се нуждаете. Трябва да бъдете особено внимателни с външните пренасочвания - това са пренасочвания, които се извършват чрез изпращане на хедър на сървъра към клиента с код НЕ 200 (връщане на цяла страница), а с различен код (най-често 301 и 302) и които водят до пренасочване в клиентския браузър към друг URL, т.е. да направите нова заявка на клиента.
Следователно всяко външно пренасочване винаги води до загуба на време при обработка на заявката, т.к. трябва да изпратите отговор на клиента, той трябва да го прочете и да повтори заявката, като използва нов URL. Това е времеемка процедура. Следователно пренасочванията трябва да са само ако наистина имате нужда от тях.