Сегодня я хочу рассказать о htaccess, файле, который позволяет настраивать веб-сервер Apache. Директивы, которые прописываются в этом файле напрямую влияют на выдачу, которую формирует веб-сервер. Инструмент этот достаточно мощный, использовать его нужно с умом. Статья эта написана больше полугода назад, теперь я снова к ней возвращаюсь, чтобы сделать самым подробным мануалом на эту тему.
Сразу напомню, прежде чем что либо менять в htaccess — сделайте копию вашего рабочего файла в укромное место. Мало ли, резервное копирование вообще хорошая вещь, не забывайте об этом. Я разделю статью на несколько подразделов — перенаправление страниц, запрет доступа к определенным файлам, ускорение сайта и прочие штуки, которые так или иначе могут пригодиться в работе ресурса.
Для начала — пару слов, что такое htaccess? Процитирую официальный сайт веб-сервера Apache:
.htaccess файлы (или «распределенные конфигурационные файлы») позволяют задавать большое количество дополнительных параметров и разрешений для работы веб-сервера в отдельных каталогах (папках), таких как управляемый доступ к каталогам, переназначение типов файлов и т. д, без изменения главного конфигурационного файла.
То есть, мы можем управлять поведением сервера в каждой, отдельно взятой папке, что очень удобно.
Директивы htaccess. Перенаправление
Блокируем хотлинки с других сайтов
Есть нехорошие товарищи, которые могут использовать картинки с вашего ресурса для использования в своих проектах. Они используют ваши изображения на своих сайтах, другими словами, используют вашу пропускную способность в своих целях, по аналогии с перемещением изображений на поддомен. Будем с ними бороться… Заменим любую картинку, на которую ведет хотлинк с другого сайта, на какое-нибудь предупреждающее изображение или на что хватит фантазии. В коде не забывайте менять адреса на ваши URL.
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?ваш-урл\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
#Замените путь к картинке
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/noHL.jpg [L]
Перенаправим RSS фиды WordPress на Feedburner
Я не думаю, что кто-то пользуется чем-то другим, отличным от Feedburner. Удобно для пользователя, удобно для владельца блога, статистика, опять же. Если вы еще не используете — крайне рекомендую. Код ниже перенаправит все ваши RSS потоки на ваш аккаунт, не забывайте только вставить нужный адрес.
RedirectMatch 301 /comments/feed/(atom|rdf|rss|rss2)/?$ http://feedburner.com/yourfeed/
В этом примере идет перенаправление двух потоков: основного RSS и обновление комментариев, если посетитель подписан на обновления.
Изменим страницы ошибок
С хостингом и сайтом случается всякое, поэтому заранее нужно быть готовым к проблемам и сделать свои страницы ошибок. А пользователи в случае проблем будут перенаправлены на соответствующую страницу. На этих страницах можно дать краткую информацию для пользователя, почему такое случилось. Контакты свои оставить, в крайнем случае.
ErrorDocument 401 /errors/authreqd.html
ErrorDocument 403 /errors/forbid.html
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/serverr.html
#Замените /errors/*.html на путь к вашим страницам ошибок
В этом примере идет перенаправление в случае основных ошибок. 404 я тоже добавил, хотя CMS обычно отрабатывают такие моменты, но бывали случаи.
301 и 302 редирект или перенаправление
301 редирект или, так называемое постоянное перенаправление — говорит о том, что страница поменяла адрес или URL и перенаправляет на новую страницу. Если у вас на сайте была проиндексированная ПС страница, а вы поменяли ее адрес — в обязательном порядке сделайте 301 редирект на новую страницу. При 301 редиректе старая страница не индексируется, а вместо нее «подставляется» новая.
Redirect 301 /old-page http://ваш-урл.ру/new-page
Собственно, похожий пример внимательный читатель увидит выше, в случае перенаправления RSS. Да, технология та же.
Бывает так, что сайт переезжает на новый домен, нужно сохранить структуру ссылок, а их могут быть сотни и тысячи, на каждую установить перенаправление нереально. Код ниже поможет разобраться с такой ситуацией:
RewriteEngine on
RewriteRule (.*) http://newdomain.ru/$1 [R=301,L]
Есть интересная методика «скрытия» внешних ссылок путем 301 редиректа. Допустим, у вас есть «сквозная» ссылка в сайдбаре, которая ведет на ваш профиль в Google+, она внешняя, то есть ведет на внешний ресурс. Для SEO очень хорошо, когда таких ссылок как можно меньше. Можно спрятать их и сделать внутренними.
Технология производства внутренних ссылок из внешних:
- ставим ссылку на мнимую страницу, допустим gering111.com/google-plus
- настраиваем 301 редирект в htaccess с этой страницы на реальную страницу вашего профиля
- посетитель ничего не чувствует, ПС довольны
302 редирект или временное перенаправление говорит ПС, что страница перемещена временно, поэтому индексировать нужно обе страницы, старую и новую.
Redirect 302 /old-page http://ваш-урл.ру/new-page
Код абсолютно такой же, как в случае с постоянным перенаправлением.
302 редирект удобно использовать, когда проводятся какие-либо долгосрочные работы на сайте и не нужно показывать посетителям «поломанные» страницы. В таком случае вам поможет этот код:
RewriteCond %{REQUEST_URI} !/inside.html$
RewriteCond %{REMOTE_ADDR} !^123.123.123.123
RewriteRule $ /inside.html [R=302,L]
Склеиваем сайты с www и без него
Очень плохо, когда сайт доступен по двум адресам, ПС это очень не любят. Склеить это в один адрес поможет код ниже:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.ваш-урл\.com$ [NC]
RewriteRule ^(.*)$ http://ваш-урл.com/$1 [R=301,L]
В этом примере — главное зеркало это адрес без www. Если необходимо сделать наоборот — поменяйте www местами, сверху уберите, внизу добавьте.
Показ страниц в зависимости от IP
RewriteCond %{REDIR} redir
RewriteRule ^/$ /about.html
Добавлять адреса можно дублированием первой строки, в последней — меняется страница для перенаправления.
Перенаправляем на главную
Перенаправление со страниц site.com/index.php и site.com/index.html на страницу site.com/. За код спасибо Василию Красноженову.
RewriteRule ^index\.html$ http://site.com [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://site.com [R=301,L]
Директивы htaccess. Разделяем доступы
Запрет доступа к сайту
Бывает такое, что необходимо запретить доступ посетителям с определенного IP, спамерам или еще кому нехорошему.
Allow from all
Deny from 192.168.0.1
Добавлять IP в список можно просто добавляя последнюю строку и меняя там адрес на нужный.
Противоположная ситуация, когда всем нужно запретить, кроме некоторых IP, тогда используем такой код:
Deny from all
Allow from 192.168.0.1
Добавлять адреса аналогично предыдущему примеру.
Запрещаем просмотр нежелательным User-Agent
Каждый браузер или приложение, которое запрашивает страницу, так или иначе имеет идентификатор — User-Agent. Можно запретить просмотр нежелательным товарищам. Это могут быть как программы, сканирующие сайты, так и старые браузеры, от поддержки которых вы целиком отказались. Ситуации бывают разные.
SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]
Order Allow,Deny
Allow from all
Deny from env=bad_bot
Полный список известных User-Agent вы можете найти на сайте http://www.user-agents.org/
Запрещаем доступ к определенному файлу
В примере стоит запрет на доступ к файлам wp-config и htaccess, тем самым повышается уровень общей защиты. Очень нужная директива, рекомендую добавить в свои файлы
<Files wp-config.php>
order allow,deny
deny from all
</Files>
#защищаем htaccess
<Files .htaccess>
order allow,deny
deny from all
</Files>
Аналогично можно защитить css и js файлы, которые используются плагинами:
order allow,deny
allow from all
</Files>
Скачивание определенных типов файлов
Современные браузеры такие умные, что иногда становится страшно. Мой Хром иногда пытается внутри себя открывать для просмотра PDF файлы, иногда вешаясь насмерть. С помощью htaccess можно принудительно сказать браузеру, что делать с тем или иным типом файлов, не оставляя этот момент на его усмотрение. В данном случае это скачивание. Дополнительные типы файлов можно добавить по аналогии.
AddType application/octet-stream .zip
AddType application/octet-stream .avi
Ограничение на доступ к админке WordPress
Если у вас постоянный IP адрес, можно только ему давать доступ к админ-панели WordPress
AuthGroupFile /dev/null
AuthName «Example Access Control»
AuthType Basic
<LIMIT GET>
order allow, deny
deny from all
allow from Ваш IP
</LIMIT>
Директивы htaccess. Техническая оптимизация и ускорение
Запрещаем автоматическое индексирование файлов
В каждой папке на сайте Apache создает, по умолчанию, индексные файлы, в которых перечисляется, какие файлы в папке находятся. Если вы не хотите давать дополнительную лазейку для злоумышленников — запретите индексирование.
Включаем gzip сжатие
Вы знаете о том, что данные на сервере можно сжать, а клиент их распакует у себя? Код ниже как раз включает такую штуку. Нужно только убедиться, что gzip разрешен на вашем хостинге, но обычно он есть.
ForceType text/javascript
Header set Content-Encoding: gzip
</FilesMatch>
<FilesMatch «\.css.gz$»>
ForceType text/css
Header set Content-Encoding: gzip
</FilesMatch>
<FilesMatch «\.js$»>
ForceType text/javascript
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !».*Safari.*»
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*)\.js$ $1\.js.gz [L]
ForceType text/javascript
</FilesMatch>
<FilesMatch «\.css$»>
ForceType text/css
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !».*Safari.*»
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*)\.css$ $1\.css.gz [L]
ForceType text/css
</FilesMatch>
Код не работает для изображений, но к ним применять gzip не рекомендуется. Именно такой код установлен у меня.
Сжатие с применением mod_deflate
Ходят слухи, что с помощью этого мода сжимать данные лучше и сайт работает быстрее. Я не могу протестировать, да и не встречал в Интернете подобных тестов. Если у кого есть такая информация — буду благодарен. А код выложу, мало ли
<filesmatch «.(js|css)$»=»">
SetOutputFilter DEFLATE
</filesmatch>
</ifmodule>
Включаем кэширование браузера клиента
Интересная директива, которая позволяет использовать кэширование браузера. Указанные типы файлов записываются в кэш браузера и при повторном вызове будут грузиться оттуда, что существенно ускоряет общую скорость загрузки сайта и дает меньшую нагрузку на ваш хостинг.
FileETag MTime Size
ExpiresActive On
ExpiresDefault «access plus 0 minutes»
ExpiresByType image/ico «access plus 1 years»
ExpiresByType text/css «access plus 1 years»
ExpiresByType text/javascript «access plus 1 years»
ExpiresByType image/gif «access plus 1 years»
ExpiresByType image/jpg «access plus 1 years»
ExpiresByType image/jpeg «access plus 1 years»
ExpiresByType image/bmp «access plus 1 years»
ExpiresByType image/png «access plus 1 years»
Указываем кодировку по умолчанию
WordPress работает с кодировкой UTF8 и делает это хорошо, но чтобы гарантированно избежать проблем с кодировкой — укажите ее принудительно, хуже не будет точно.
Ограничиваем число подключений к сайту
Современные браузеры умеют создавать несколько одновременных подключений к серверу, отдающему сайт. Если же у вас маловато ресурсов, можно ограничить число подключений.
При размещении в корневом каталоге, директива работает на весь сайт, если же положить ее в папку с файлами, которые вы отдаете на скачивание — можно ограничить скачивание в несколько потоков.
Разрешаем выполнение php внутри JavaScript
Иногда необходимо выполнить некоторый код внутри скрипта. Этот код поможет включить эту функцию
AddHandler x-httpd-php5 .js
<filesmatch «\.(js|php)$»>
SetHandler application/x-httpd-php
</filesmatch>
Вот и все, что касается htaccess и его стандартного использования. Я не стал упоминать о защите папок паролями, потому что не считаю это правильным, о «защите» от спама, путем блокировки запросов запросов без передачи Referer, потому что все современные спам-машины давно умеют это делать. Ну и прочие вещи, которые не считаю грамотно реализованными.
Напоследок хочу представить вам сервис тестирования вашего htaccess файла — http://htaccess.madewithlove.be/. Там все просто, удачного дня






Пост очень полезный, спасибо автору за подробную анатомию
Пожалуйста, пользуйтесь на здоровье
Можно ли это применить на Юкозовском сайте
Не работал с Юкозом, но не думаю, что там есть доступ к htaccess, все же бесплатный хостинг. Так что, скорее всего не получится
Хороший мануал, но я давно избавился от апача на vds — непозволительная роскошь.
Мне пришлось переехать временно, опять вот столкнулся с Апачем, поднимаю старые записи ))
У меня с основания сайте все страницы с index.php и я хочу его убрать, но хотелось бы сделать и редирект, например:
с http:// сайт .ru/index.php/cat/statyi
на http:// сайт .ru/cat/statyi
Подскажите, как сделать грамотно через RewriteRule.
Я что-то не пойму, у вас http://сайт.ru/index.php/cat/statyi действительно так выглядит URL?
Против ботов-
SetEnvIfNoCase User-Agent «^libwww-perl*» block_bad_bots
Deny from env=block_bad_bots
Угу, согласен. ЮзерАгентов можно засунуть любых, ссылку на список я давал выше
Очень подробно, отлично, спасибо.
Особенно мне пригодится запрет по IP, ато спамеры сегодня атакуют.
В закладки, плюсанул, твитнул.
Здравствуйте, полезная статья, подскажите мне решение такой проблемы. Недавно произвёл склейку сайтов, но появилась проблема, на старом домене нужна одна страница без редиректа через htaccess, т.е. чтоб одна страница непереадресовывала на новый домен, можно добавить какое то исключение в htaccess и если можно то какое. Извиняюсь если мой вопрос вам покажется слегка запутанным.
а можно сделать так, чтобы индексная страница(index.php) открывалась только с урлов данного сайта) то есть заходит чел с улицы и попадает на индексную страницу hello.php, а кликнул по сцылке -ГЛАВНАЯ СТРАНИЦА — и попал на вторую индексную страницу index.php ? — как наверное уже догадались такое для блога применимо, так как в корне index.php — используется движком) ???
Я в целом понял, но зачем городить это через htaccess. Тем более, это очень трудно реализовать (я вообще сомневаюсь, что возможно) Для таких целей используют плагины, которые отслеживают, откуда чел зашел и подсовывают то, что нужно.
Здравствуйте! хочу скрыть ссылку в адресной строке браузера! как это сделать подскажите плиз! за ранее спс! Респект автору!
Скрыть строку не получится, тут работает не сайт, а браузер посетителя. Можно только вместо страницы А подсовывать страницу Б. Но это не то, что вам нужно, насколько я понял
Очень полезная статья, спасибо, проверила почти все директивы у себя на сайте, но вот включение кэширования браузера клиента вызвало 500 ошибку сервера.
Наиболее частая причина 500 ошибки, при работе c htaccess — неверная директива. Проверьте еще раз, особенно синтаксис
Спасибо автору за статью, у меня взломали хостинг, и 4 сайта полетело, с помощью этой статьи только смогла разобраться как вылечить все!
Я рад, что у вас все получилось и моя статья смогла вам помочь
Пусть больше не будет взломов
Здравствуйте!
Подскажите, пожалуйста, как с помощью htaccess на «лету» убирать из ссылки определенный текст?
К примеру, мне надо из ссылки
«http://www…….ru/index.php?page=shop.product_details&product_id=150&flypage=yagendoo_VaMazing_zoom2.tpl&pop=0&o…….»
убрать вот это: «&flypage=yagendoo_VaMazing_zoom2.tpl»
Заранее благодарен!
Думаю, htaccess вам не поможет. Тут надо копаться в движке и смотреть, как формируется ссылка.