Отворили сте .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), браузърът може да го „запомни“ и да продължи да го прилага, затова го тествайте в нов прозорец или след изчистване на кеша (временно запазените данни на браузъра).
Къде да намерим готови примери?
Готови примери за пренасочвания има и в други наши материали:
- Пренасочване от един URL адрес към друг (htaccess) | Help – пренасочване на адрес към адрес, на файл към директория и обратно, както и според IP адреса на посетителя;
- Домейн пренасочвания в cPanel | Help – пренасочвания 301 и 302 през cPanel и как да поставите правилото над това на WordPress;
- Защита от директни връзки към ресурсите в сайта | Help – блокиране или пренасочване на заявки според адреса, от който идват.
В заключение
Пренаписващите правила не са толкова сложни, колкото изглеждат: три директиви, няколко символа и ясен ред. Най-важните неща, които да запомните:
- RewriteEngine On само включва механизма – самото пренасочване се задава от RewriteRule;
- Добавяйте RewriteEngine On само веднъж, в началото на файла;
- Подреждайте правилата от най-специфичното към най-общото;
- Собствените си правила добавяйте извън блока на WordPress, над # BEGIN WordPress;
- Преди промяна правете копие на .htaccess, а след нея проверявайте сайта.
Ако пренасочването не работи, както очаквате, ние можем да Ви помогнем.
Абонирайте се за СуперБлога, за да получавате полезно и експертно познание от света на уеб хостинг услугите, касаещо Вашия сайт и дигитално присъствие.
![7 домейн идеи за успешна Black Friday кампания [Аудио] 7 домейн идеи за успешна Black Friday кампания](https://blog.superhosting.bg/wp-content/uploads/2019/10/SH-Promo-domains-BF-Blog-2-1-150x150.png)
![7+1 мита за SaaS услугите [Аудио] 7+1 мита за SaaS услугите](https://blog.superhosting.bg/wp-content/uploads/2021/08/SH-SaaS_illustration_blog.png)
![10 основни грешки при изграждането на един уебсайт [Аудио] 10 основни грешки при изграждането на един уебсайт](https://blog.superhosting.bg/wp-content/uploads/2021/10/SH_Fail_blog-1-150x150.png)