Навіщо служить .htaccess?
Набираючи адресу в рядку браузера, ви отримуєте на комп’ютер файли, які відображає браузер. Керування тим, які файли та як вам показувати (пересилати) здійснює веб-сервер. Найбільш популярних серверів два: IIS та Apache.
Як і будь-яка програма, веб-сервер має певні опції. Але, у вас, як користувача Апача може (і швидше за все не буде, якщо говорити про віртуальний хостинг) прав змінювати конфігурацію Апача через його головні файли, дія яких поширюється на всіх користувачів цього сервера. Але, ви можете змінювати деякі конфігураційні файли, які розповсюджують свою дію лише на ваш сайт. Один з таких файлів – .htaccess
Це файл гнучкої установки веб-сервера Апач. “Гнучкий” позначає, що як тільки ви змінили щось у цьому файлі, зміни відразу набирають чинності. За допомогою нього можна перевизначити багато директив з файлу httpd.conf (цей файл є головним конфігураційним файлом сервера Апач і його дії поширюються повністю на всіх користувачів даної копії Апача). У випадках, коли у вас немає доступу до файлу налаштування Апача (той самий віртуальний хостинг), вам допоможе саме цей файл.
Цей файл недоступний для веб-браузера. Якщо файл .htaccess розташований у кореневій директорії сервера, його дії поширюється на весь сервер, крім тих папок, де є інший файл .htaccess (і крім всіх папок “нижче” цієї папки з другим .htaccess).
Приклад:
Структура ваших директорій на сервері така:
|-user
| |
| -user1
| |
| -user2
|
|-data
| |
| -data1
| |
| -data2
|
Директорії user1 та user2 будуть вкладені по відношенню до директорії user. Якщо ми помістимо в директорію www файл .htaccess, його дія буде автоматично поширюватися і директорії user1 і user2.
У директорію data поміщаємо інший файл .htaccess, порівняно, про те, що у директорії user. І для директорій data1 і data2 діятиме файл .htacсess, що у data.
Тепер, в директорію user2 ми поміщаємо ще один файл .htaccess, який відрізняється від того, що знаходиться в директорії 2-ма рівнями вище (це директорія user). В результаті, налаштування для директорії user2 будуть визначатися лише тим файлом .htaccess, який знаходиться у цій директорії.
Так як найчастіше Апач налаштований так, що завжди шукає цей файл в директорії, то .htaccess допоможе вам швидко і без зупинки сервера зробити його переналаштування.
Синтаксис .htaccess
Ось обов’язковий синтаксис, недотримання якого призводить до помилок сервера:
– шляхи до файлів (директорій) вказуються від кореня сервера. Приклад: /opt/home/www.astanafoto.com/htdocs/config/.htpasswords
– домени із зазначенням протоколу
Приклад: Redirect/http://www.site.ua
Файл має назву “точка” htaccess
Має бути записаний у UNIX-форматі. Для оболонки FAR досягається F4 (редагування файлу), Shift+F2 (вибрати “зберегти як UNIX-текст”).
Як заборонити відвідувачам читати файли в директорії?
Заборона на всі файли:
deny from all
Де все означає “все”.
Дозволити доступ із певного ip:
order allow deny
deny from all
allow from< ваш ip>
В даному випадку,< ваш ip> позначає конкретну адресу.
Наприклад:
order allow deny
deny from all
allow from 192.126.12.199
Заборонити доступ із певного ip:
order allow deny
deny from< ваш ip>
Використання< ваш ip> аналогічно для прикладу вище.
Заборона на групу файлів за маскою:
<Files “\.(inc|sql|…інші розширення…)$”>
order allow,deny
deny from all
</Files>
Визначає доступ до файлу для його розширення.
Наприклад, заборона доступу до файлів із розширенням “inc” для веб-відвідувачів:
<Files “\.(inc)$”>
order allow,deny
deny from all
</Files>
У цьому прикладі сам веб-сервер Апач може звертатися до файлів з такими розширеннями.
Заборона на конкретний файл:
Можна встановити заборону на конкретний файл за його назвою та розширенням.
<Files config.inc.php>
order allow,deny
deny from all
</Files>
У цьому прикладі стоїть заборона звернення до файлу config.inc.php.
Пароль на директорію:
AuthName “Private zone”
AuthType Basic
AuthUserFile /pub/home/твій_логін/.htpasswd
require valid-user
</Files>
Значення AuthName буде виводитись для відвідувача і може використовуватися для пояснення запиту авторизації. Значення AuthUserFile вказує на місце, де зберігається файл із паролями для доступу до цієї директорії. Цей файл створюється спеціальною утилітою htpasswd.exe.
Наприклад у директорії, яку захищаємо паролем, створюємо такий .htaccess:
AuthName “For Registered Users Only”
AuthType Basic
AuthUserFile /pub/site.ua/.htpasswd
require valid-user
</Files>
У цьому прикладі відвідувач при запиті директорії читатиме фразу “For Registered Users Only”, файл з паролями для доступу повинен лежати в директорії /pub/site.ua/ і називатися .htapasswd . Директорія вказується від кореня сервера, якщо ви неправильно поставите директорію, то Апач не зможе прочитати файл .htpasswd і ніхто не отримає доступу до цієї директорії.
Пароль лише на 1 файл:
Аналогічно паролювання директорії повністю, можна ставити пароль тільки на 1 файл.
Приклад встановлення пароля на файл private.zip:
<Files private.zip>
AuthName “Users zone”
AuthType Basic
AuthUserFile /pub/home/твій_логін/.htpasswd
</Files>
Пароль на групу файлів:
Аналогічно, використовуючи< Files “\.(inc|sql|…інші розширення…)$”> , можна ставити паролі маски файлів.
Приклад установки пароля на доступ до всіх файлів з розширенням “sql”:
<Files “\.(sql)$”>
AuthName “Users zone”
AuthType Basic
AuthUserFile /pub/home/твій_логін/.htpasswd
</Files>
Перевірка прав доступу
Завдання: є каталог a1 і в ньому два вкладені каталоги a2, a3, введено 2 рівні користувачів. 1 група має доступ тільки до a1 та a2, 2-а до всіх трьох каталогів. Необхідно проводити аутентифікацію лише 1 раз – при доступі до a1, але при цьому дотримуватися прав на доступ до а2 та а3.
Нік і пароль запитуються тільки при вході на а1 – якщо юзвер має доступ на а2 пароль вже не запитується. Якщо а3 доступу немає, вилетить табличка ” введіть пароль ” .
www.site.ua/a1
www.site.ua/a1/а2
www.site.ua/a1/a3
a1 – загальний і водночас закритий. а2 і а3 лише окремих осіб.
файл .htaccess для каталогу а1:
AuthName “Input password”
AuthType Basic
AuthUserFile “/pub/home/login/htdocs/clousearea/.htpasswd”
<Files *.*>
require valid-user
</Files>
файл .htaccess для каталогу а2:
AuthName “Input password”
AuthType Basic
AuthUserFile “/pub/home/login/htdocs/clousearea/.htpasswd”
<Files *.*>
require user юзвер1 юзвер2 юзвер3
</Files *.*>
файл .htaccess для каталогу а3:
AuthName “Input password”
AuthType Basic
AuthUserFile “/pub/home/абв/htdocs/clousearea/.htpasswd”
<Files *.*>
require user юзвер1 юзвер4 юзвер5
</Files *.*>
Як зробити перенапрямок (редирект) відвідувача?
Редирект на інший url:
Щоб зробити перенаправлення відвідувача на сайт http://site.ua в .htaccess Redirect / http://www.site.ua
Редирект будь-якої сторінки сайту на індексний файл:
RewriteEngine on
RewriteRule !\index.html$ /index.html
Показ різних сторінок, залежно від IP-адреси відвідувача:
SetEnvIf REMOTE_ADDR< потрібна ip адреса> REDIR=”redir”
RewriteCond%{REDIR} redir
RewriteRule ^/$ /another_page.html
Наприклад, перенаправлення відвідувачів з ip адресою 192.12.131.1 на сторінку about_my_sity.html:
SetEnvIf REMOTE_ADDR 192.12.131.1 REDIR=”redir”
RewriteCond%{REDIR} redir
RewriteRule ^/$ /about_my_sity.html
Перенаправлення відвідувача за запитом певних сторінок:
Це вже для всіх мережевих вірусів та сканерів. Тепер будь-який запит з адресою /_vti_bin автоматично перенаправлятиметься на Microsoft:
redirect /_vti_bin http://www.microsoft.com
redirect /scripts http://www.microsoft.com
redirect /MSADC http://www.microsoft.com
redirect /c http://www.microsoft.com
redirect /d http://www.microsoft.com
redirect /_mem_bin http://www.microsoft.com
redirect /msadc http://www.microsoft.com
RedirectMatch (.*)\cmd.exe$ http://www.microsoft.com$1
Як зробити стартовою іншу сторінку?
Щоб змінити сторінку, яка буде відображатися при зверненні до директорії, пишемо:
DirectoryIndex< потрібна сторінка>
Можна вказати кілька сторінок.
DirectoryIndex index.shtml index.php index.php3 index.html index.htm
Як змусити Апач обробляти директиви SSI?
SSI дозволяють “збирати” сторінку зі шматочків. В одному шматочку у вас код меню, в іншому код верхньої частини сторінки, в третьому – нижній. А відвідувач бачить звичайну сторінку, яка складається з коду, який входить у ваші шматочки.
Необхідні обов’язкові установки httpd.conf:
У блоці, що починається з< Directory/> і закінчується< /Directory> у рядок Options Indexes додайте Includes.
Після, у файлі .htaccess пишемо:
AddHandler server-parsed .shtml .shtm .html .htm
Як змусити Апач виконувати у html документах php код?
Іноді буває корисно обдурити відвідувача, видаючи йому свої php-скрипти або інші файли, як html файли. Реально використовується для індексації пошуковою системою Rambler php-скриптів. Деякі роблю дрібні фішки, на кшталт того, що дають фалам розширення, що збігаються з будь-якими “знаковими” іменами.
RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml
При велику відвідуваність сервера може викликати гальма. Запитуйте у адміна.
Для серверів на cloudlinux конструкція виглядатиме так:
<FilesMatch “.(php|htm|html)$”>
AddHandler application/x-httpd-lsphp .php .htm .html
</FilesMatch>
Як самому обробляти помилки Апача?
Найбільш цікаві та корисні помилки Апача це: 403-404, 500.
403 – користувач не пройшов автентифікацію, заборона доступу (Forbided).
404 – запитуваний документ (файл, директорія) не знайдено.
500 – внутрішня помилка сервера (наприклад, помилка в синтаксисі файлу .htaccess).
Для того, щоб користувачеві при цих помилках були показані ваші власні повідомлення про помилки, в .htaccess пишемо:
ErrorDocument 403 /errors/403.html
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/500.html
При цьому при виникненні помилки 404 користувачеві завантажиться файл errors/403.html.
Зручно робити власний обробник деякі помилки. У .htaccess пишемо:
ErrorDocument 403 /errors/error.php?403
ErrorDocument 404 /errors/error.php?404
ErrorDocument 500 /errors/error.php?500
В error.php через $HTTP_SERVER_VARS[‘REQUEST_URI’] визначаємо, який документ викликав помилку і далі обробляємо. Якщо в .htaccess на ErrorDocument стоїть вказівка файлу з повним шляхом (http://site.ua/error.php), $HTTP_SERVER_VARS[‘REQUEST_URI’] буде містити цей файл, а не викликав помилку.
В Internet Explorer 5.0 неправильно обробляється файл, що викликається при помилці, якщо його розмір менший за 1 кілобайт. Буде викликано стандартну сторінку IE 404.
Як поставити заборону відображення вмісту директорії за відсутності індексного файлу?
Припустимо, що у вас вся графіка, яка використовується на сайті, знаходиться в директорії img. Відвідувач може набрати в адресному рядку браузера цю директорію та побачити список усіх ваших графічних файлів. Звичайно, це не завдасть вам шкоди, але можна і не дати такого перегляду відвідувачу. У .htaccess пишемо:
Options -Indexes
Чи можна вказати кодування на всі файли, де за замовчуванням отримує документи браузер?
На зорі інтернету і зародження браузерів часто була ситуація, що браузер не міг автоматично визначити, в якому з російських кодувань написаний документ і в браузер видавалася якась каша. Для уникнення цього вказуємо, що всі сторінки, що віддаються, матимуть кодування windows-1251:
AddDefaultCharset windows-1251
Чи можна вказати кодування на файли, що завантажуються?
При завантаженні відвідувачем файлу на сервер, можливе перекодування його – вказуємо, що всі файли, що отримуються, будуть мати кодування windows-1251:
CharsetSourceEnc windows-1251
Створив файл .htaccess, але сервер видає 500 помилку – Internal Erorr
Помилка синтаксису або файл записаний не в тому форматі.
Дивіться питання #2.