Настройка .htaccess. Полное руководство

htaccess

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

Сразу напомню, прежде чем что либо менять в htaccess — сделайте копию вашего рабочего файла в укромное место. Мало ли, резервное копирование вообще хорошая вещь, не забывайте об этом. Я разделю статью на несколько подразделов — перенаправление страниц, запрет доступа к определенным файлам, ускорение сайта и прочие штуки, которые так или иначе могут пригодиться в работе ресурса.

Для начала — пару слов, что такое htaccess? Процитирую официальный сайт веб-сервера Apache:

.htaccess файлы (или «распределенные конфигурационные файлы») позволяют задавать большое количество дополнительных параметров и разрешений для работы веб-сервера в отдельных каталогах (папках), таких как управляемый доступ к каталогам, переназначение типов файлов и т. д, без изменения главного конфигурационного файла.

То есть, мы можем управлять поведением сервера в каждой, отдельно взятой папке, что очень удобно.

Директивы htaccess. Перенаправление

Блокируем хотлинки с других сайтов

Есть нехорошие товарищи, которые могут использовать картинки с вашего ресурса для использования в своих проектах. Они используют ваши изображения на своих сайтах, другими словами, используют вашу пропускную способность в своих целях, по аналогии с перемещением изображений на поддомен. Будем с ними бороться… Заменим любую картинку, на которую ведет хотлинк с другого сайта, на какое-нибудь предупреждающее изображение или на что хватит фантазии. В коде не забывайте менять адреса на ваши URL.

RewriteEngine On
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 /feed/(atom|rdf|rss|rss2)/?$ http://feedburner.com/yourfeed/
RedirectMatch 301 /comments/feed/(atom|rdf|rss|rss2)/?$ http://feedburner.com/yourfeed/

В этом примере идет перенаправление двух потоков: основного RSS и обновление комментариев, если посетитель подписан на обновления.

Изменим страницы ошибок

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

ErrorDocument 400 /errors/badrequest.html
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 редиректе старая страница не индексируется, а вместо нее «подставляется» новая.

RewriteEngine on
Redirect 301 /old-page http://ваш-урл.ру/new-page

Собственно, похожий пример внимательный читатель увидит выше, в случае перенаправления RSS. Да, технология та же.
Бывает так, что сайт переезжает на новый домен, нужно сохранить структуру ссылок, а их могут быть сотни и тысячи, на каждую установить перенаправление нереально. Код ниже поможет разобраться с такой ситуацией:

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://newdomain.ru/$1 [R=301,L]

Есть интересная методика «скрытия» внешних ссылок путем 301 редиректа. Допустим, у вас есть «сквозная» ссылка в сайдбаре, которая ведет на ваш профиль в Google+, она внешняя, то есть ведет на внешний ресурс. Для SEO очень хорошо, когда таких ссылок как можно меньше. Можно спрятать их и сделать внутренними.

Технология производства внутренних ссылок из внешних:

  • ставим ссылку на мнимую страницу, допустим gering111.com/google-plus
  • настраиваем 301 редирект в htaccess с этой страницы на реальную страницу вашего профиля
  • посетитель ничего не чувствует, ПС довольны 😉

Подобным образом можно ставить любые другие условно постоянные ссылки.
302 редирект или временное перенаправление говорит ПС, что страница перемещена временно, поэтому индексировать нужно обе страницы, старую и новую.

RewriteEngine on
Redirect 302 /old-page http://ваш-урл.ру/new-page

Код абсолютно такой же, как в случае с постоянным перенаправлением.
302 редирект удобно использовать, когда проводятся какие-либо долгосрочные работы на сайте и не нужно показывать посетителям «поломанные» страницы. В таком случае вам поможет этот код:

RewriteEngine on
RewriteCond %{REQUEST_URI} !/inside.html$
RewriteCond %{REMOTE_ADDR} !^123.123.123.123
RewriteRule $ /inside.html [R=302,L]

Склеиваем сайты с www и без него

Очень плохо, когда сайт доступен по двум адресам, ПС это очень не любят. Склеить это в один адрес поможет код ниже:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.ваш-урл\.com$ [NC]
RewriteRule ^(.*)$ http://ваш-урл.com/$1 [R=301,L]

В этом примере — главное зеркало это адрес без www. Если необходимо сделать наоборот — поменяйте www местами, сверху уберите, внизу добавьте.

Показ страниц в зависимости от IP

SetEnvIf REMOTE_ADDR 192.168.0.1 REDIR="redir"
RewriteCond %{REDIR} redir
RewriteRule ^/$ /about.html

Добавлять адреса можно дублированием первой строки, в последней — меняется страница для перенаправления.

Перенаправляем на главную

Перенаправление со страниц site.com/index.php и site.com/index.html на страницу site.com/.

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
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, спамерам или еще кому нехорошему.

Order Allow,Deny
Allow from all
Deny from 192.168.0.1

Добавлять IP в список можно просто добавляя последнюю строку и меняя там адрес на нужный.
Противоположная ситуация, когда всем нужно запретить, кроме некоторых IP, тогда используем такой код:

Order Deny,Allow
Deny from all
Allow from 192.168.0.1

Добавлять адреса аналогично предыдущему примеру.

Запрещаем просмотр нежелательным User-Agent

Каждый браузер или приложение, которое запрашивает страницу, так или иначе имеет идентификатор — User-Agent. Можно запретить просмотр нежелательным товарищам. Это могут быть как программы, сканирующие сайты, так и старые браузеры, от поддержки которых вы целиком отказались. Ситуации бывают разные.

SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
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 вы можете найти на сайте < noindex>http://www.user-agents.org/

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

В примере стоит запрет на доступ к файлам wp-config и htaccess, тем самым повышается уровень общей защиты. Очень нужная директива, рекомендую добавить в свои файлы

# защищаем wpconfig.php
<Files wp-config.php>
order allow,deny
deny from all
</Files>
#защищаем htaccess
<Files .htaccess>
order allow,deny
deny from all
</Files>

Аналогично можно защитить css и js файлы, которые используются плагинами:

<Files ~ "\.(js|css)$">
order allow,deny
allow from all
</Files>

Скачивание определенных типов файлов

Современные браузеры такие умные, что иногда становится страшно. Мой Хром иногда пытается внутри себя открывать для просмотра PDF файлы, иногда вешаясь насмерть. С помощью htaccess можно принудительно сказать браузеру, что делать с тем или иным типом файлов, не оставляя этот момент на его усмотрение. В данном случае это скачивание. Дополнительные типы файлов можно добавить по аналогии.

AddType application/octet-stream .pdf
AddType application/octet-stream .zip
AddType application/octet-stream .avi

Ограничение на доступ к админке WordPress

Если у вас постоянный IP адрес, можно только ему давать доступ к админ-панели WordPress

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "Example Access Control"
AuthType Basic
<LIMIT GET>
order allow, deny
deny from all
allow from Ваш IP
</LIMIT>

Директивы htaccess. Техническая оптимизация и ускорение

Запрещаем автоматическое индексирование файлов

В каждой папке на сайте Apache создает, по умолчанию, индексные файлы, в которых перечисляется, какие файлы в папке находятся. Если вы не хотите давать дополнительную лазейку для злоумышленников — запретите индексирование.

Options -Indexes

Включаем gzip сжатие

Вы знаете о том, что данные на сервере можно сжать, а клиент их распакует у себя? Код ниже как раз включает такую штуку. Нужно только убедиться, что gzip разрешен на вашем хостинге, но обычно он есть.

<FilesMatch "\.js.gz$">
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

Ходят слухи, что с помощью этого мода сжимать данные лучше и сайт работает быстрее. Я не могу протестировать, да и не встречал в Интернете подобных тестов. Если у кого есть такая информация — буду благодарен. А код выложу, мало ли 😉

<ifmodule mod_deflate.c="">
<filesmatch ".(js|css)$"="">
SetOutputFilter DEFLATE
</filesmatch>
</ifmodule>

Включаем кэширование браузера клиента

Интересная директива, которая позволяет использовать кэширование браузера. Указанные типы файлов записываются в кэш браузера и при повторном вызове будут грузиться оттуда, что существенно ускоряет общую скорость загрузки сайта и дает меньшую нагрузку на ваш хостинг.

Header append Cache-Control "public"
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 и делает это хорошо, но чтобы гарантированно избежать проблем с кодировкой — укажите ее принудительно, хуже не будет точно.

AddDefaultCharset UTF-8

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

Современные браузеры умеют создавать несколько одновременных подключений к серверу, отдающему сайт. Если же у вас маловато ресурсов, можно ограничить число подключений.

MaxClients <количество подключений>

При размещении в корневом каталоге, директива работает на весь сайт, если же положить ее в папку с файлами, которые вы отдаете на скачивание — можно ограничить скачивание в несколько потоков.

Разрешаем выполнение php внутри JavaScript

Иногда необходимо выполнить некоторый код внутри скрипта. Этот код поможет включить эту функцию

AddType application/x-httpd-php .js
AddHandler x-httpd-php5 .js
<filesmatch "\.(js|php)$">
SetHandler application/x-httpd-php
</filesmatch>

Вот и все, что касается htaccess и его стандартного использования. Я не стал упоминать о защите папок паролями, потому что не считаю это правильным, о «защите» от спама, путем блокировки запросов запросов без передачи Referer, потому что все современные спам-машины давно умеют это делать. Ну и прочие вещи, которые не считаю грамотно реализованными.

Напоследок хочу представить вам сервис тестирования вашего htaccess файла — http://htaccess.madewithlove.be/. Там все просто, удачного дня

 


Комментарии: