внимание! Пренасочванията на кеша на браузърите.

По някаква причина в Runet информацията за локалната конфигурация на уеб сървъраApacheчрез конфигурационния файл.htaccessе дадена някак непълно и едностранчиво. Дават се предимно примери (често не работещи) или сух превод на документация на английски език.

Пренасочванията се изпълняват с помощта на модулаmod_rewrite. Правилата за трансформация са зададени под формата на следната конструкция:

Правилата за трансформация са записани в следната форма:

РедовеRewriteCond- задават условията за задействане на следното правилоRewriteRule. Може да има няколко условия, те се налагат според правилотоИ. Но можете да промените правилото наИЛИс помощта на флагаИЛИ.

Различни променливи могат да се използват като[НИЗОВЕ ЗА СРАВНЕНИЕ]. Връзка към пълния списък Ще дам само тези, които са най-необходими:

[CONDITION], както и[PATTERN]е съвместим с perl регулярен израз, с някои добавки, позволяващи например проверка дали е файл или съществуващ url.

[ФЛАГИ]Флаговете се изписват в квадратни скоби, разделени със запетаи: [NC,OR]. Флагове за условия:

Подизрази в регулярни изрази (оградени в скоби) са налични за вмъкване в[Substitution STRING], трябва да се обърнете към подизразите, както следва:%N- за подизрази в условия (RewriteCond) и$N- за подизрази в правила (RewriteRule), къдетоNе пореден номер на подизраза.

RewriteRule- правило за заместване. Ако заявката съвпада с проверки нагоре и[ШАБЛОН], тогава се прилага правилото за заместване. Тук можете също да контролирате поведението с помощта на флагове. Има различни флагове, ето най-често използваните:

Надявам се след моякратко въведение в теорията, ще ви бъде по-лесно да разберете какво е написано във вашия.htaccess. Ето връзка към много добър превод за модулаmod_rewrite, можете да намерите и други добри преводи там.

внимание! Пренасочванията на кеша на браузърите.

Освен това обичайните комбинации катоCtrl+F5илиCtrl+Rне помагат. По време на тестване всеки път отварям страницата в НОВ прозорец в режим инкогнито. Освен това старите страници в режим инкогнито трябва да бъдат затворени.

Универсално пренасочване от www към без www

Тук най-интересното е, че по някаква причина навсякъде се дават примери, които са твърдо обвързани с домейна на сайта. Защо?, ако има универсално решение:

Универсално пренасочване от без www към www

Тук е малко по-сложно. Първото условие е необходимо за получаване на домейна (%1), то винаги е вярно. Второто условие проверява дали домейнът не започва с www. Е, самото правило е подобно на предишния пример.

Обикновено пренасочване

За просто пренасочване не е необходимо да задавате условия, а само правило.

Пренаписване без пренасочване

Пренасочване от GET параметри

Например, имате нужда от пренасочване от страница/?action=page&id=15към/page/15/:

Нека обясня, с първото условие проверяваме дали има параметър за получаванеaction=page, с второто условие проверяваме дали id е равно на число. Тези условия не могат да се комбинират, т.к параметрите могат да вървят и обратно, т.е.index.php?action=page&id=15иindex.php?id=15&action=pageтрябва да са еквивалентни. Но накрая, правилото е, че там всичко е нормално, с изключение на въпросителния знак (?) в края. Имаме нужда от него, за да отрежем оригиналните GET параметри, в противен случай ще получим/page/15/?action=page&id=15

Пренасочване към мобилната версия на сайта

Да кажем, че мобилната версия се намира наподдомейнm.site.ru. Ще преминем към мобилната версия само от главната страница на основния домейн.

В първия ред проверяваме USER_AGENT, установяваме, че се отнася за мобилни телефони. (Не проверих подробно този ред, взех го в интернет, може би не е съвсем правилен или има по-универсален ред. Но този пример работи на моите мобилни устройства)

Във втория ред проверяваме дали сме на желания домейн (защото примера не е универсален)

На третия ред проверяваме дали сме на главната страница (без никакви параметри и други неща) и пренасочваме към поддомейн.

Универсална версия

Харесва ми всичко да е универсално, така че един и същ код да работи на различни проекти без никакви редакции. За да направя това, преработих предишния пример:

Пренасочване от началната страница

Говорим за заявка катоsite.ru(без site.ru/index.php)

Тук всичко се оказа не толкова очевидно, срещнах необяснимо поведение.

Пренаписване без пренасочване (url не се променя).Работещ вариант:

Пренасочване.НЕ работещ вариант:

Пренаписване без пренасочване (url не се променя).НЕ работещ вариант:

Пренасочване.Работещ вариант:

Ако някой ми каже защо тези примери работят на кръст, но не работят наобратно, ще се радвам много.