Използване на .htaccess файлове

Автор Владимир Колев | Вариант за отпечатване Вариант за отпечатване   

1 Star2 Stars3 Stars4 Stars5 Stars (2гласа, средно: 5.00 от общо 5)
Loading ... Loading ...
 

Всеки имащ собствена страница и работещ с Apache сървър е чувал за тези файлове, това което правят реално е промяна  на настройките за определена директория от вашия уебсървър. .htaccess файловете се добавт в самата директория на сайта ви и конфигурационните директиви са валидни както за нея така и за поддиректориите й. Това, което ви позволяват е по-лесно конфигуриране на определени директории, като могато да пренаписват настройките зададени в httpd.conf. По този начин ако използвате уебхостинг и нямате достъп до конфигурационния файл на Apache пак можете да зададете някои специфични настройки. Конфигурационните директиви, които ще разгледаме в тази статия са следните:

  • Options +/-Indexing – разрешаване на листването на файловете в директория и опциите, които можете да използвате към това
  • mod_rewrite – задаване на красиви връзки в страницата (премахване на .html и .php)
  • AuthType – Задаване на парола за достъп до дадена директория
  • allow/deny – блокиране на IP адреси
  • ErrorDocument – собствени страници за грешки

Разбира се, с .htaccess файловете можете да постигнете още много неща, но смятам, че след като разберете основата и простите трикове лесно ще можете да разберете и останалото за тези файлове в Apache уроците.

Списък със съдържанието на директория

Вероятно сте забелязали в много сървъри, че дори и в странците на дистрибуциите как се показва списък с файловете на сървъра като по този начин се избягва използването на php скриптове за показване на списък с файлове и поддиректории. Това можете да постигнете и с няколко опции в един .htaccess файл. Нека започнем от това как да разрешите показването на списък със съдържанието на директория.

За да разрешите тази опция първо трябва да добавите следното във вашия .htaccess файл:

[bash]Options +Indexes[/bash]

Реално това само е достатъчно, за да покажете списък с файловете в директорията. Но на много хостинг сървъри това, което ще получите е един най-елементарен списък с файлове – без размер, без разширение на файловете, без допълнителна информация. Ако това е достатъчно за вас можете да оставите нещата до тук. В дрги сървъри опциите, които следват са добавени още в httpd.conf така, че списъка ще бъде показан доста по-разширено. За пример ще дам директорията с IRC логове на GooBot от #ubuntu-bg.Както ще видите на страницата има списък, показващ подробности за файловете в директорията, но има и допълнителна информация както и картинка. Тези неща се разрешават със следната директива във файла:

[bash]IndexOptions FancyIndexing[/bash]

Този ред разрешава подробния списък и е основен за допълнителни разширения към списъка като добавяне на опсиания към файловете, добавяне на икони за определени файлови формати. За повече информация за опциите към FancyIndexing можете да погледнете документацията за mod_autoindex.

Как обаче към този списък да добавиме и информация, която да се показва над списъка и под списъка? Това става съответно с конфигурационните директиви HeaderName и ReadmeName. Създайте файловете header.html и reader.html (разбира се могат да имат и други наименования) и ги качете в директорията. След което в .htaccess файла добавете информацита:

[bash]HeaderName header.html
ReadmeName reader.html[/bash]

Във файловете не е необходимо добавянето на , тъй като те са добавени автоматично от Apache сървъра. Но тези файлове ще се виждат при показването на списъка. За целта можем да ги игнорираме. Това ще стане с директивата IndexIgnore като можете да забраните всички .html файлове или точно определени. В директорията с логове, където смятам да показвам само текстови файлове няма смисъл да показвам каквито и да било .html файлове:

[bash]IndexIgnore *.html[/bash]

Като казах, че в директорията ще показвам текстови фйалове тук идва един проблем, с който се сблъсках. Файловете макар и записани в UTF-8 кодиране на текста бяха показвани с друго, което е зададено по подразбиране от сървъра. Решението е добавянето на директивата AddCharset по следния начин за всички текстови файлове:

[bash]AddCharset UTF-8 .txt[/bash]
А ако искате това да е валидно за всички файлове:
[bash]AddCharset UTF-8 *[/bash]

Използване на mod_rewrite

За да разрешите самото презаписване на връзките във вашата страница е важно да добавите първо включването на този Apache модул:

[bash]Options +FollowSymlinks
RewriteEngine on[/bash]

За да разберете дали сървърът, който ползвате има разрешен mod_rewrite или дали е поне разрешен можете да проверите в нормалното phpinfo(). Създавате файл phpinfo.php, качвате го на сървъра и го стартирате през бразуъра.
Опцията +FollowSymlinks също е задължителна, за да можете да пишете правила за презаписване. Така приемам, че mod_rewrite е разрешен. Самото използване на RewriteEngine изисква и малко познания за RegEx (регулярни изрази), които в този урок няма да бъдат покрити. Ще ви покажа само как да премахнете .html или .php от връзките, тъй като останлото можете да го намерите като готово в интернет или пък като прегледаде съдържанието на .htaccess файла на някоя CMS система.
Премахване на .html от линковете:

[bash]RewriteRule ^([^\.]+)$ $1.html [NC,L][/bash]

Но при този пример какво ще се получи ако същевременно със името на .html файла имате и такава директория? Това означава, че ще трябва да добавиме условие, което ще проверява за подобни неща. Това става с директивата RewriteCond преди да добавиме правилото за презапис:

[bash]RewriteCond %{SCRIPT_FILENAME} !-d[/bash]
Заменяне на .html с .php окончание във връзките (ако искате да заблудите някого, че ползвате .php :-) )
[bash]RewriteRule ^(.*)\.php$ $1.html [NC,L][/bash]

Защита на директория с парола

Ако искате дадена директория да бъде достъпна само за определени потребители това можете да направите с допълнителен файл, който може да бъде наречен .htpasswd и е за предпочитане да бъде поставен в директория, до която няма достъп чрез HTTP REQUEST. За пример ако имате сървър и видимата за HTTP заявки директория е /var/www просто можете да създадете директория /var/secret, която няма да бъде видима и в която можете да поставите файал с потребители и пароли /var/secret/.htpasswd Разбира се файла може да се намира и в директория, която е видиме за посетителите на вашата страница, но тогава трябва да се уверите, че те няма да виждат този файл и той няма да бъде достъпен за техните очи (погледнете IndexIgnore). Нека първо създадем файла. Съдържанието му трябва да има следния формат:

[plain]user:pass
user2:pass2
….[/plain]
След като разполагаме с файла в .htaccess трябва да добавим следното:
[bash]AuthType basic
AuthUserFile /var/secret/.htpasswd
AuthName "Only for dudes"
require valid-user[/bash]

Какво всъщност означава това. Първия ред показва, че искаме просто разрешение за достъп (за разлика от ДБ или дайджест разрешение например). с AuthUserFile посочваме в кой файл се намира информацията за потребители и техните пароли. С AuthName оказваме как ще се казва диалога, който изисква потребителско име и парола. И директивата require valid-user оказва, че достъп ще до директорията ще получат само тези въвели верни име и парола. Последната директива е и най-интересна, защото използвайки един .htpassd файл, можете да ограничите определени директории само до определени потебители:

require user user2 user4

С това разрешаваме достъпа само на потребителите user2 и user4.

Блокиране на IP адреси

Блокирането на IP адреси е също удобен вариант ако има конкретни такива, които не желаете да имат достъп до вашата страница. Имайте предвид, че тази мярка не е перфектна и може да бъде заобиколена. Даже бих си позволил да кажа, че е напълно излишна, но пък защо да не я знаете. Би била позлезна ако използвате сървъра в локална мрежа и искате да ограничите шефа да вижда сървъра :-P .

Самото блокиране е директива order allow, deny със списък от разрешени и забранени IP-та. За повече яснота ето и пример:

[bash]order allow, deny
deny 192.168.1.4
deny .microsoft.com
deny 79.79.79.
allow from all[/bash]

С deny пред всеки адрес или домейн оказваме, че те нямат достъп. В последния deny 79.79.79. блокираме всички IP-та, които започват с 79.79.79. По същия начин можем да блокираме и всички IP-та започващи с 53. (точката е част от IP-то). Разбира се можем да направим и забрана за всички:

[bash]deny from all[/bash]
и вместо списък със забранени IP адреси да сложим списък с разрешени IP адреси.

Собствени ERROR страници

Задаването на собствени страници за грешка става с директивата ErrorDocument. С нея можете да окажете при каква грешка, кой файл да показва. Доста удобно ако желаете да разкрасите 404 грешката за липсващ такъв файл. Това става по следния начин:

[bash]ErrorDocument 404 /errors/funyerror.html[/bash]
Формата е същия, за добавяне на страници и за други грешки просто:
[bash]ErrorDocument грешка /път/до/файл[/bash]

Надявам се статията да е била полезна. Тя не пoкрива по-задълбоченото разглеждане на този вид файлове, тъй като самото им използване се препоръчва да бъде избягвано. Използването на този вид файлове е по-скоро предназначено за хората, ползващи платен хостинг, където нямат собствен php.ini файл и това е единствения начин да разрешат използването на определени функции.

Относно автора

Владимир Колев е написал 48 статии в този блог.

Студент в техническия университет в град Кьолн/Германия. Занимава се с програмиране от 6 години. Предпочитан език за програмиране Python. Други езици: C, Java, PHP, MySQL, SQLite.


Вашите коментари

3 Коментара

  1. frankopld
    Posted 07/03/2010 at 16:11 | Permalink | Reply

    Адски полезно четиво.Мерси !!!

  2. Posted 31/03/2010 at 23:41 | Permalink | Reply

    Заради такива полезни статии обичам блоговете

  3. Posted 03/05/2010 at 21:24 | Permalink | Reply

    Перфектно Просто Точно Това Търсех И Точно Това Намерих Благодаря Много Знаех error 404 със htaccess знаех и други но не знаех как е за забраняване на ip да влиза в сайта но тук намерих благодаря.

    //Редактиран коментар без коригирани правописни и пунктуационни грешки. Моля друг път пишете на кирилица!

Публикувай коментар

Вашият е-мейл никога няма да бъде споделен. Задължителните полета са маркирани с *

*
*

Switch to our mobile site