Файл .htaccess

Файл .htaccess нужен для того чтобы иметь возможность переопределять базовые настройки web сервера Apache. Таких файлов на сайте может быть несколько. Каждый файл .htaccess распространяет свои правила на папки которые находятся на том же уровне в дереве ресурсов, или ниже, но не затрагивает каталоги в которых размещен другой файл .htaccess.

Стоит помнить, что обработка файлов .htaccess может быть запрещена в настройках веб-сервера, полностью или частично.

Не все операционные системы и программы позволяют создавать файл с точкой вначале, чтобы обойти это ограничение, можно создать обычный текстовый файл в notepad++ или другом доступном блокноте, и воспользоваться функцией «Сохранить как».

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

Комментарии в файле — символ # проставленный в начале строки

# Эта строка будет проигнорирована веб-сервером

Если после редактирования или размещения .htaccess при обращении к сайту вы получили ошибку 500, то, скорее всего, в файле .htaccess допущена ошибка. Посмотреть её причины можно в файле error_log вашего сервера. 

Редиректы

Самая часто используемая функция .htaccess — Redirect. Эта директива сообщает браузеру о том, что по указанному адресу необходимо загрузить другую страницу, в простонародье — сделать редирект.

Простой редирект оформляют по схеме:

Redirect [статус] URL-путь-указанный-в-адресе URL-на-который-надо-переадресовать

Статус — необязательный параметр. Но часто он бывает важен для поисковых роботов. Возможные значения:

  • 301 / permanent — документ перемещен постоянно
  • 302 / temp — документ перемещен временно
  • 303 / seeother — смотрите другой
  • 410 / gone — убран

Подобный редирект не работает для адресов содержащих Query String (символы после ?). В таких случаях используют сочетание RewriteCond и RewriteRule.

  • RewriteCond — определяет условие при котором происходит преобразование
  • RewriteRule — правило для преобразования

Примеры редиректов

Перенаправить запросы со старого адреса страницы на новый

Redirect 301 /page.html http://www.domain.ru/new_page.html

Перенаправить все запросы к страницам сайта на аналогичные страницы другого сайта с использованием redirect

Redirect 301 / http://www.newdomain.ru/

Перенаправить все запросы к страницам сайта на аналогичные страницы другого сайта с использованием rewriteRule

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.ru/$1 [R=301,L]

Перенаправить запросы на domain.ru с любого из синонимов сайта

RewriteEngine On
RewriteCond % !^domain\.ru$ [NC]
RewriteRule ^(.*)$ http://domain.ru/$1 [L,R=301]

Перенаправить запросы на www.domain.ru с любого из синонимов сайта

RewriteEngine On
RewriteCond % !^www\.domain\.ru$ [NC]
RewriteRule ^(.*)$ http://www.domain.ru/$1[L,R=301]

Перенаправление всех запросов к странице /period/?test=123 на domain.ru

Options +FollowSymLinks
RewriteEngine On
RewriteCond % ^test=123$ [NC]
RewriteRule ^period/$ http://domain.ru/ [L,R=301]

 Со страниц без слеша на страницы со слешем

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.]+)(?<!/)$ /$1/ [R=301,L]

C http на https (актуален для timeweb)

RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]

Переопределение страниц ошибок

#401  Авторизация не выполнена
ErrorDocument 401 /401.html

#403  Доступ запрещен
ErrorDocument 403 /403.html

#404  Страница не найдена
ErrorDocument 404 /404.html

#500  Внутренняя ошибка сервера
ErrorDocument 500 /500.html

Ограничение доступа к сайту по IP

Запретить доступ к сайту с IP-адресов 123.4.5.6 и 123.5.4.3

Order Allow,Deny
Allow from all
Deny from 123.4.5.6 123.5.4.3

Запретить доступ к сайту со всех адресов кроме 123.4.5.6 и 123.5.4.3:

Order Deny,Allow
Deny from all
Allow from 123.4.5.6 123.5.4.3

Запретить доступ к сайту для всех:

Deny from all

Запрет доступа к некоторым файлам

К файлам с расширением .cfg

<FilesMatch "\.(cfg)$">
Order allow,deny
Deny from all
</FilesMatch>

Закрыть директорию паролем

AuthType Basic
AuthName "Some Name"
AuthUserFile /home/uXXXXX/.htpasswd
require valid-user 

Путь /home/uXXXXX/.htpasswd обозначает полный путь к файлу паролей на диске сервера.

Файл с паролями должен содержать строки вида login:password. Пароль должен быть зашифрован с использованием алгоритма MD5. Один из способов создать такой файл — воспользоваться программой, входящей в поставку Apache — htpasswd 

Переопределение главной страницы сайта (индексного файла каталога)

Сделать главной страницей файл menu.html:

DirectoryIndex menu.html

MIME типы файлов

Чтобы понять, какие документы надо показывать как html, какие как графику, а к каким надо выдать меню, позволяющее сохранить файл на диск, браузер использует MIME типы.

MIME типы описывается набором символов, отражающим тип используемых данных. Например, файлам с расширением .html соответствует тип text/html. В ответ на пришедший запрос html-файла сервер возвращает заголовок Content-type: text/html. Браузер, получив такой заголовок, знает, что документ с типом данных text/html это обычная веб-страница на языке HTML. 

Все доступные MIME типы

Пример распространенных MIME типов данных

 Описание данных

Расширение файлов

MIME type

Картинки gif

gif

image/gif

Картинки jpeg

jpeg jpg jpe

image/jpeg

VRML-файлы

wrl vrml

model/vrml

HTML-документ

html htm

text/html

Обычный текст

asc txt

text/plain

Архив ZIP

zip

application/zip

Файл MS Word

doc

application/msword

Файл MS Excel

xls

application/vnd.ms-excel

Файл MS Power Point

ppt

application/vnd.ms-powerpoint

Файл Adobe Acrobat

pdf

application/pdf

Flash-документ

swf

application/x-shockwave-flash

Добавление MIME типов файлов

Периодически появляются новые MIME типы, которые не известны веб серверам, соответственно, в этом случае браузеры не смогут понять как обрабатывать указанный объект. Чтобы исправить эту проблему новые MIME типы надо добавить в настройках сервера или в файле .htaccess. Так же это пригодиться в случае если надо переопределить базовый MIME тип для уже известного расширения. 

Файлы заканчивающиеся на / будут открываться как html:

AddType "text/html" /

Переопределение кодировки

AddType "text/html; charset=koi8-r" .html .htm .shtml

Назначить расширению действие

AddHandler 

Отключить принудительную выдачу заголовка с кодировкой

При этом соответствующая кодировка должна быть прописана на каждой html-странице в виде тега 

<http-equiv="Content-type" content="text/html; charset=windows-1251" />

AddDefaultCharset Off

Включение обработки PHP в .html-файлах

RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml

Выдача листинга каталога 

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

С настройками по умолчанию, Apache, в случае отсутствия в папке главной страницы (индексного файла), при обращении без указания конкретного имени файла в запросе выдаст список всех файлов, находящихся в каталоге. Для того чтобы запретить отображение листинга каталога, достаточно добавить в файл .htaccess строку:

Options -Indexes

Разрешение выдачи листинга каталога

Options +Indexes

# если возникла проблема с кодировкой, ее можно определить добавив
Charset=UTF-8

Включить выполнение CGI-скриптов в папке docs для файлов с расширениями .cgi, .pl. .py

В папке c CGI-скриптами необходимо разместить файл .htaccess с содержимым:

AddHandler cgi-script .cgi .pl .py
Options +ExecCGI

Скрипт должен иметь атрибут исполнения (+x, права доступа, начинающиеся с 7, например, 755).

Блокировка переходов со сторонних ресурсов

Для запрета перехода c baddomain.ru на domain.ru добавьте в .htaccess следующее:

RewriteEngine on
RewriteCond % baddomain\.ru [NC]
RewriteRule .* - [F]

Если требуется запретить переходы с нескольких доменов, то используйте такие директивы

RewriteEngine on
RewriteCond % baddomain\.ru [NC,OR]
RewriteCond % baddomain2\.ru [NC,OR]
RewriteCond % baddomain3\.ru [NC]
RewriteRule .* - [F]

Включение передачи заголовка Last-Modified для файлов .htm .html

Если не передается заголовок Last-Modified но по какой-либо причине он нужен, то включить его можно следующим параметром

RemoveHandler .html. .htm

Кириллические домены

(.РФ, .МОСКВА и др.)

В файле .htaccess использование кириллицы не допускается. При составлении правил перенаправления для кириллических доменов необходимо указывать имя домена в punycode. Узнать имя домена в punycode можно с помощью сервиса Whois.

Например, для перенаправления site.ru на caйт.рф нужно воспользоваться следующим правилом:

RewriteEngine on
RewriteCond % ^www\.site.ru [NC]
RewriteRule ^(.*)$ http://xn--80aswg.xn--p1ai /$1 [R=301,L]

При этом посетители могут увидеть именно punycode-представление доменного имени в адресной строке браузера. Это не является ошибкой.

Полезные ссылки

Руководство по mod_rewrite

Модуль mod_alias