.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 за да запазите промяната:
Примери с използване на 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 се разглежда само ако текущото състояние е изпълнено. |