Пренасочвания в .htaccess: RewriteEngine, RewriteCond и RewriteRule

Отворили сте .htaccess файла на сайта си и сте видели ред като RewriteEngine On, а под него още няколко реда, които започват с Rewrite. Какво представляват те и безопасно ли е да ги променяте?

Това са пренаписващи правила (на английски Rewrite rules). Чрез тях Apache променя адреса, който посетителят е поискал, преди да реши какво да му покаже: или го пренасочва към друг адрес, или зарежда друг файл, без адресът в браузъра да се променя. Затова ги наричаме „пренаписващи“ – сървърът „пренаписва“ адреса според зададените правила. Те на пръв поглед изглеждат сложни и неразбираеми, но се състоят от три основни директиви (команди, с които на Apache се казва какво да направи):

  • RewriteEngine;
  • RewriteCond;
  • RewriteRule.

След като разясним какво значи всяка от тях, ще можете лесно да разбирате и променяте готови примери. Ще разгледаме и как изглеждат пренаписващите правила на WordPress.

Накратко

RewriteEngine On само по себе си не пренасочва нищо – то само включва механизма. Пренаписващите правила се състоят от три директиви: RewriteEngine включва механизма, RewriteCond задава условие, а RewriteRule извършва пренасочването. За да четете и променяте готови примери, достатъчно е да познавате няколко символа от регулярните изрази и да спазвате реда на правилата – особено в сайт на WordPress.

Какво е RewriteEngine On и какво можете да правите с него?

Какво е RewriteEngine On?

RewriteEngine в .htaccess е директива на Apache уеб сървъра, която включва или изключва механизма за пренаписване на URL адреси (URL rewriting). Най-често ще я срещнете така:

RewriteEngine On

Това активира модула mod_rewrite, който позволява да променяте начина, по който сървърът обработва заявките към URL адресите. Може да си го представите като главен прекъсвач: докато е изключен (RewriteEngine Off), всички останали пренаписващи правила се игнорират. Обикновено този ред се добавя само веднъж, в началото на файла.

Важно: RewriteEngine On само по себе си не пренасочва нищо. То активира механизма, а конкретното поведение се задава чрез RewriteRule и евентуално RewriteCond. Необходимо е и Apache да има активен модул mod_rewrite.

Какво можете да правите с RewriteEngine?

Ето трите най-чести случая. Във всеки от примерите е показан и редът RewriteEngine On, но ако в един файл имате няколко правила, той се пише само веднъж, в началото.

1. Пренасочване към друг URL адрес

Например, за да пренасочите посетителите от HTTP към HTTPS:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Така посетителят автоматично се пренасочва към защитената HTTPS версия на сайта. Същото пренасочване може да се запише и по друг начин – с RewriteCond %{HTTPS} off и конкретен адрес на домейна, както ще видите в раздела за WordPress.

2. Премахване на .php от URL адреса

Ако искате адресът https://example.com/about да зарежда файла about.php, можете да използвате:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^about$ about.php [L]

Това позволява на потребителя да вижда по-кратък и чист URL адрес. Правилото важи само за адреса /about; за всяка друга страница е нужно отделно правило.

3. Пренасочване от един адрес към друг

Например, от /old-page към /new-page:

RewriteEngine On
RewriteRule ^old-page/?$ /new-page [R=301,L]

R=301 означава постоянно пренасочване, а L указва на Apache да спре обработката на останалите правила за текущия цикъл. Флаговете са обяснени по-подробно по-долу.

Какво означават основните директиви?

Ето как се подреждат директивите, които видяхте в примерите:

ДирективаЗначение
RewriteEngine OnАктивира URL пренаписването
RewriteEngine OffИзключва URL пренаписването
RewriteRuleОпределя как да се променя или пренасочва URL адресът
RewriteCondЗадава условие, което трябва да е изпълнено
[R=301]Извършва постоянно HTTP пренасочване
[L]Спира обработката на следващите правила в текущия цикъл

RewriteCond

Директивата RewriteCond задава условие. Тя означава: изпълни следващото правило само ако е изпълнено определено условие. Например:

RewriteCond %{HTTPS} off

означава: ако сайтът е отворен през HTTP (а не HTTPS). След това идва самото действие – RewriteRule. Тоест първо се проверява условието, а след това се изпълнява правилото.

Можете да зададете и няколко условия едно след друго. Например:

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.example\.com$

В този случай пренасочването ще се изпълни само ако и двете условия са изпълнени едновременно.

RewriteRule

Това е редът, който извършва действието. Например:

RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

Той казва: вземи адреса, който потребителят е поискал, и го пренасочи към новия URL адрес. Почти всички пренаписващи правила следват една и съща структура:

RewriteRule КаквоДаТърси КъдеДаПренасочи [Флагове]

Какво означават „странните“ символи и как се чете едно цялостно правило?

В правилата често ще срещнете символи като ^, $, .*, \. и (). Това са регулярни изрази (Regular Expressions). Не е необходимо да ги изучавате подробно. Достатъчно е да знаете няколко основни символа. Те описват как изглежда адресът, който искаме да „хванем“ – като шаблон за търсене.

Символът ^ – начало на текста

Например ^blog ще съвпадне с blog и blog/article, но няма да съвпадне с myblog.

Символът $ – край на текста

Например php$ ще съвпадне с index.php. Адресът се сравнява без параметрите след „?“, затова php$ ще съвпадне и с index.php?id=5. Параметрите се проверяват отделно – с RewriteCond и променливата %{QUERY_STRING}, за която ще говорим по-долу.

Символът (.*) – „вземи всичко“

Това е най-често използваният шаблон в пренаписващите правила и означава: вземи всичко, независимо какво е. Например, ако посетителят отвори https://oldsite.com/blog/article-1, то правилото:

RewriteRule ^(.*)$ https://newsite.com/$1

ще пренасочи към https://newsite.com/blog/article-1. Променливата $1 съдържа текста, който е намерен от първата група (.*).

Скобите () – групи

Скобите създават така наречените групи. Например (products)/(.*) позволява различните части на URL адреса да бъдат използвани по-късно като $1 и $2. Това е особено полезно при по-сложни пренасочвания. Как изглежда това в цялостно правило – по-долу, в подраздела „Цялостно правило ред по ред“.

Символът . – точката като специален знак

В регулярните изрази точката има специално значение. Ако искате да търсите истинска точка, трябва да я „избягате“ (ескейпнете или екранирате) с обратна наклонена черта. Например example\.com съвпада точно с example.com, а не с произволни символи между „example“ и „com“.

Символът ! – НЕ

В пренаписващите правила ! означава НЕ. Например „!-f“ се чете като „не е съществуващ файл“, а „!-d“ означава „не е съществуваща директория“.

Цялостно правило ред по ред

Нека съберем казаното дотук в едно цялостно правило. Да кажем, че искаме адресите, които започват с /products/, да се пренасочват към /shop/ на същия сайт. В .htaccess това изглежда така:

RewriteEngine On
RewriteRule ^(products)/(.*)$ https://example.com/shop/$2 [R=301,L]

Нека прочетем правилото по части:

  • RewriteRule – директивата, която извършва действието;
  • ^ – адресът трябва да започва оттук (начало на текста);
  • (products) – първата група; в $1 се запазва думата products, но в това правило не я ползваме;
  • / – буквалната наклонена черта след products;
  • (.*) – втората група: всичко след /products/; то се запазва в $2;
  • $ – край на адреса;
  • https://example.com/shop/$2 – новият адрес, в който $2 се заменя с намереното от втората група;
  • [R=301,L] – флагове: постоянно пренасочване и край на обработката (обяснени са по-долу).

Ако посетителят отвори https://example.com/products/shoes, ще бъде пренасочен към https://example.com/shop/shoes. Къде точно да добавите такова правило в сайт на WordPress – в следващия раздел.

Как изглеждат пренаписващите правила на WordPress?

Вероятно много пъти сте виждали пренаписващите правила в WordPress. Ето какво означават:

# Включва механизма за пренаписващи правила.
RewriteEngine On
# Определя началната директория, от която започват пренаписващите правила.
RewriteBase /
# Ако заявката е към файла index.php,
# не изпълнявай следващите пренаписващи правила.
RewriteRule ^index\.php$ - [L]
# Ако заявката НЕ е към съществуващ файл...
RewriteCond %{REQUEST_FILENAME} !-f
# ...и НЕ е към съществуваща директория...
RewriteCond %{REQUEST_FILENAME} !-d
# Всички останали заявки се изпращат към index.php.
RewriteRule . /index.php [L]

В .htaccess файла на сайта тези редове са оградени от маркери – # BEGIN WordPress в началото и # END WordPress в края. Те се създават и обновяват от самия WordPress, например при запис на настройките за постоянни връзки. Затова всичко, което сте добавили между двата маркера, може да бъде презаписано. Собствените си правила (пренасочвания, защити) добавяйте извън тях – най-често над # BEGIN WordPress.

Така правилата ще се изпълнят, преди WordPress да изпрати заявката към index.php. Ето как изглежда например пренасочването към HTTPS в .htaccess на WordPress сайт:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
# BEGIN WordPress
# ... правилата на WordPress ...
# END WordPress

Как работят постоянните връзки и кои правила са нужни за тях – вижте повече: Постоянни връзки (permalinks) в WordPress | Help

Какво представляват променливите %{…} и флаговете в квадратни скоби?

Променливите %{…}

Apache предоставя информация за всяка заявка чрез така наречените сървърни променливи. Най-често използваните са:

  • %{HTTP_HOST} – съдържа името на домейна, например www.example.com или example.com. Използва се най-често при пренасочване между адреса с www и без www;
  • %{HTTPS} – показва дали връзката е защитена. Възможните стойности са on (включено) и off (изключено). Използва се за автоматично пренасочване към HTTPS;
  • %{REQUEST_URI} – съдържа адреса след домейна. Например при https://example.com/blog/article стойността е /blog/article;
  • %{QUERY_STRING} – съдържа параметрите след въпросителния знак. Например при https://example.com/product.php?id=25&page=2 стойността е id=25&page=2. Именно тази променлива позволява да правим пренасочвания според параметрите в URL адреса. Параметрите не са част от адреса, с който се сравнява RewriteRule, затова се проверяват с RewriteCond и тази променлива.

Флаговете в квадратни скоби

В края на RewriteRule, в квадратни скоби, се задават флагове – допълнителни инструкции как да се изпълни правилото. Най-често ще срещнете:

  • L (от last – „последно“) – спира обработката: ако правилото съвпадне, следващите пренаписващи правила не се изпълняват;
  • R=301 (R е от redirect – „пренасочване“) – изпраща на браузъра постоянно пренасочване. Само R, без число, означава 302 (временно). Препоръчително е да се комбинира с L, тоест [R=301,L];
  • NC (от nocase – „без значение на регистъра“) – съвпадението не различава главни от малки букви;
  • OR („или“) – при RewriteCond свързва условието със следващото с „или“. По подразбиране условията са свързани с „и“.

За разликата между 301 и 302 – вижте повече: Домейн пренасочвания в cPanel | Help

Защо редът на правилата е от голямо значение?

Вече знаете, че Apache чете файла .htaccess отгоре надолу. За всяка заявка той преминава през правилата едно след друго. Ако дадено правило съдържа флага [L], обработката спира и останалите пренаписващи правила вече не се изпълняват.

Затова подредбата на правилата има значение. По-специфичните пренасочвания обикновено се поставят преди по-общите, за да не бъдат „изпреварени“ от тях.

Важно: Преди да промените .htaccess, направете копие на файла, а след промяната проверете сайта и няколко негови страници – грешка в синтаксиса води до грешка 500 (Internal Server Error – „вътрешна грешка на сървъра“). Ако пренасочването е постоянно (301), браузърът може да го „запомни“ и да продължи да го прилага, затова го тествайте в нов прозорец или след изчистване на кеша (временно запазените данни на браузъра).

Къде да намерим готови примери?

Готови примери за пренасочвания има и в други наши материали:

В заключение

Пренаписващите правила не са толкова сложни, колкото изглеждат: три директиви, няколко символа и ясен ред. Най-важните неща, които да запомните:

  • RewriteEngine On само включва механизма – самото пренасочване се задава от RewriteRule;
  • Добавяйте RewriteEngine On само веднъж, в началото на файла;
  • Подреждайте правилата от най-специфичното към най-общото;
  • Собствените си правила добавяйте извън блока на WordPress, над # BEGIN WordPress;
  • Преди промяна правете копие на .htaccess, а след нея проверявайте сайта.

Ако пренасочването не работи, както очаквате, ние можем да Ви помогнем.


Абонирайте се за СуперБлога, за да получавате полезно и експертно познание от света на уеб хостинг услугите, касаещо Вашия сайт и дигитално присъствие.

Димитър Милушев
Димитър Милушев
Митко е мениджър “Техническа поддръжка” и част от екипа повече от 15 години. Той отговаря за това нашите клиенти да получават бързо и коректно обслужване на техните технически казуси. Винаги дава 100% от себе си в това, което върши.
0 0 votes
.
Абониране
Уведоми ме при
guest

0 Коментара
Inline Feedbacks
View all comments

Имам онлайн магазин, но нямам поръчки. Защо? [Аудио]

0
Изграждането на работещ онлайн магазин изисква време, постоянство и много работа! Ако вече имате магазин, но нямате продажби, вижте възможните причини.
10 основни грешки при изграждането на един уебсайт

10 основни грешки при изграждането на един уебсайт [Аудио]

0
Последствията от неправилно структурирания сайт могат да бъдат неприятни за бизнеса Ви и да доведат до нежелан ефект.
7 идеи за повече трафик към вашия онлайн магазин

7 идеи за повече трафик към Вашия онлайн магазин [Аудио]

0
Какви са начините да повишите трафика към вашия сайт? Предлагаме ви няколко идеи за постигане на по-добри резултати.