.htaccess - използване на mod_rewrite модул на apache уеб сървър

Помощен център

.htaccess - използване на mod_rewrite модул на apache уеб сървър

Apache модулът mod_rewrite е базиран на регулярни изрази и позволява презаписване или иначе казано пренасочване на URL заявки към определена поддиректория, като това пренасочване се извършва на сървърно ниво.

Например, искаме когато въведем адрес: example.com да отворим ресурс, който се хоства в поддиректория /folder1/ на този URL, а именно:

example.com/folder1/resource.html

Този ефект може да бъде постигнат с mod_rewrite.

Функционалността на mod_rewrite се дефинира в .htaccess файл в основната директория на потребителя. За да се виждат във файловия мениджър служебните файлове, чието име започва с точка, трябва да кликнете бутона Settings и да маркирате опцията Show Hidden Files (dotfiles) и да кликнете бутона Save за да запазите промяната:

apache mod_rewrite

Примери с използване на mod_rewrite

Първо ще покажем няколко примера, след което ще обясним кое какво означава в примерите.

В първият пример ще покажем как да пренасочим URL:

http://www.example.com/folder1/ към

http://www.example.com/folder2/

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^folder1.*$ http://www.example.com/folder2/ [R=301,L]

Ако желаем URL http://www.example.com/folder1/ да отваря home директорията на нашия сайт а именно http://www.example.com, то нашият .htaccess файл трябва да изглежда по следния начин:

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^folder1.*$ http://www.example.com/ [R=301,L]

Следващият пример ще пренасочи URL адресът:

http://www.example.com/folder1/file.htm да се отваря от

http://www.example.com/folder2/file.html

Важно да се отбележи, че за да работи успешно пренасочването, съдържанието на двете папки трябва да бъде идентично.

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^folder1/(.*)$ http://example.com/folder2/$1 [R=301,L]

mod_rewrite директиви

  • Options +FollowSymLinks - това е директива на apache web сървъра, която е необходима за да използваме mod_rewrite модула.
  • RewriteEngine - директива, която разрешава използването на mod_rewrite.
  • RewriteRule - чрез тази директива дефинираме самото правило.

Първата част от израза след RewriteRule дефинира как изглежда оригиналния URL адрес. Както споменахме по-горе, тази дефиниция се базира на регулярни изрази. Кратко ръководство за тях е поместено в края на статията.

Втората част след RewriteRule дефинира новият URL път до ресурса. Този линк е с отношение към основната папка на хостинга document root, също така могат да бъдат включвани и поддиректории.

Символът $1, използван в края на последния пример, указва подстраниците да бъдат извиквани от новата локация, която сме избрали. Това е направено само в последния пример тъй като само тук има идентично съдържание, ако няма идентично съдържание както в първите два примера, $1 не се добавя.

[R=301,L] - този ред осъществява пренасочване със статус код 301 и също така спира всяко следващо презаписване чрез флага L. Допълнителна информация за наличните флагове, използвани в mod_rewrite, е поместена в края на статията.

В следващия пример ще ви покажем как може да пренасочите URL адрес http://www.example.com/file.html към адрес http://www.example.com/folder1/file.html

За да работи пренасочването успешно трябва папка folder1 да съществува и да има съдържание в нея.

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} example.com$ [NC]
RewriteCond %{HTTP_HOST} !folder1
RewriteRule ^(.*)$ http://example.com/folder1/$1 [R=301,L]

В този пример има няколко нови директиви:

RewriteCond %{HTTP_HOST} - указва кои адреси ще се пренасочват и кои не. В нашият случай искаме да пренасочим example.com.

! показва какво не искаме да се пренасочи.

[NC] - този флаг означава no case и прави директивата нечувствителна към регистъра (малки/главни букви) на шрифта.

Пренасочване на http://example.com към http://www.example.com. Този пример също ще работи и ако опитаме да достъпим определен файл например http://example.com/file.html:

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Регулярни изрази (regular expression, regex)

Регулярен израз означава търсене на текст по даден шаблон. В тази част от статията ще опишем основните символи, които се използват при регулярните изрази.

СимволОписание
^показва началото на израза за който ще се търси съвпадение.
$показва края на израза за който ще се търси съвпадение.
^index.html$показва, че търсеното съдържание трябва да е точно index.html
.показва всеки непразен символ.
*показва, че предишния символ може да се съдържа в нула или повече съвпадения.
^archive.*$по този начин има съвпадение с всеки израз, който започва с archive: archive2012, archive_daily.
^.*$показва прихвани всичко, това може да бъде полезно в случай когато не знаем какъв URL ще въведе потребителя.

Флагове в mod_rewrite

Ако пренаписването на URL адрес трябва да бъде свързано с определени опции (флагове), които контролират поведението на mod_rewrite, те се показват в квадратни скоби след RewriteRule и се разделят със запетаи, ако са повече от една.

По този начин може да се приложи и външно пренасочване чрез HTTP код на състоянието. Следната таблица показва набор от опции за RewriteRule. Пълният списък може да бъде намерен на официалния уебсайт на Apache.

ОпцияФлагОписание
Redirect (пренасочване)RФлагът [R] се използва за HTTP пренасочване, което се изпълнява от браузъра със статус код 302. За да използвате друг статус код, добавете го със знак за равенство към флага, напр. [R=301].
Forbidden (забранен)FФлагът [F] инструктира уеб сървъра да изпрати на браузера статус код 403 (Forbidden).
Gone (изчезнал)GУеб сървърът изпраща на браузъра статус код 410 (Gone) и показва, че вече не е достъпен ресурса, който е бил на достъпен преди това.
Last (последен)LФлагът [L] кара mod_rewrite да спре обработването на набора от правила.
Nocase (без шрифт)NCФлагът [NC] показва, че шрифта (малки/главни букви) няма значение при проверка дали URL адреса отговаря на условията за пренаписване.
Chain (верига)CСледващото правило RewriteRule се разглежда само ако текущото състояние е изпълнено.