Сегодня я хочу рассказать о htaccess, файле, который позволяет настраивать веб-сервер Apache. Директивы, которые прописываются в этом файле напрямую влияют на выдачу, которую формирует веб-сервер. Инструмент этот достаточно мощный, использовать его нужно с умом. Статья эта написана больше полугода назад, теперь я снова к ней возвращаюсь, чтобы сделать самым подробным мануалом на эту тему.
Сразу напомню, прежде чем что либо менять в htaccess — сделайте копию вашего рабочего файла в укромное место. Мало ли, резервное копирование вообще хорошая вещь, не забывайте об этом. Я разделю статью на несколько подразделов — перенаправление страниц, запрет доступа к определенным файлам, ускорение сайта и прочие штуки, которые так или иначе могут пригодиться в работе ресурса.
Сразу напомню, прежде чем что либо менять в htaccess — сделайте копию вашего рабочего файла в укромное место. Мало ли, резервное копирование вообще хорошая вещь, не забывайте об этом. Я разделю статью на несколько подразделов — перенаправление страниц, запрет доступа к определенным файлам, ускорение сайта и прочие штуки, которые так или иначе могут пригодиться в работе ресурса.
Для начала — пару слов, что такое htaccess? Процитирую официальный сайт веб-сервера Apache:
.htaccess файлы (или «распределенные конфигурационные файлы») позволяют задавать большое количество дополнительных параметров и разрешений для работы веб-сервера в отдельных каталогах (папках), таких как управляемый доступ к каталогам, переназначение типов файлов и т. д, без изменения главного конфигурационного файла.
То есть, мы можем управлять поведением сервера в каждой, отдельно взятой папке, что очень удобно.
Директивы htaccess. Перенаправление
Блокируем хотлинки с других сайтов
Есть нехорошие товарищи, которые могут использовать картинки с вашего ресурса для использования в своих проектах. Они используют ваши изображения на своих сайтах, другими словами, используют вашу пропускную способность в своих целях, по аналогии с перемещением изображений на поддомен. Будем с ними бороться… Заменим любую картинку, на которую ведет хотлинк с другого сайта, на какое-нибудь предупреждающее изображение или на что хватит фантазии. В коде не забывайте менять адреса на ваши URL.
1
2
3
4
5
| 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 потоки на ваш аккаунт, не забывайте только вставить нужный адрес.
1
2
| RedirectMatch 301 /feed/(atom|rdf|rss|rss2)/?$ RedirectMatch 301 /comments/feed/(atom|rdf|rss|rss2)/?$ http: //feedburner.com/yourfeed/ |
В этом примере идет перенаправление двух потоков: основного RSS и обновление комментариев, если посетитель подписан на обновления.
Изменим страницы ошибок
С хостингом и сайтом случается всякое, поэтому заранее нужно быть готовым к проблемам и сделать свои страницы ошибок. А пользователи в случае проблем будут перенаправлены на соответствующую страницу. На этих страницах можно дать краткую информацию для пользователя, почему такое случилось. Контакты свои оставить, в крайнем случае.
1
2
3
4
5
6
| 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 редиректе старая страница не индексируется, а вместо нее «подставляется» новая.
1
2
| RewriteEngine on Redirect 301 /old-page http: //ваш-урл.ру/new-page |
Собственно, похожий пример внимательный читатель увидит выше, в случае перенаправления RSS. Да, технология та же.
Бывает так, что сайт переезжает на новый домен, нужно сохранить структуру ссылок, а их могут быть сотни и тысячи, на каждую установить перенаправление нереально. Код ниже поможет разобраться с такой ситуацией:
Бывает так, что сайт переезжает на новый домен, нужно сохранить структуру ссылок, а их могут быть сотни и тысячи, на каждую установить перенаправление нереально. Код ниже поможет разобраться с такой ситуацией:
1
2
3
| Options +FollowSymLinks RewriteEngine on RewriteRule (.*) [R=301,L] |
Есть интересная методика «скрытия» внешних ссылок путем 301 редиректа. Допустим, у вас есть «сквозная» ссылка в сайдбаре, которая ведет на ваш профиль в Google+, она внешняя, то есть ведет на внешний ресурс. Для SEO очень хорошо, когда таких ссылок как можно меньше. Можно спрятать их и сделать внутренними.
Технология производства внутренних ссылок из внешних:
- ставим ссылку на мнимую страницу, допустим gering111.com/google-plus
- настраиваем 301 редирект в htaccess с этой страницы на реальную страницу вашего профиля
- посетитель ничего не чувствует, ПС довольны
Подобным образом можно ставить любые другие условно постоянные ссылки.
302 редирект или временное перенаправление говорит ПС, что страница перемещена временно, поэтому индексировать нужно обе страницы, старую и новую.
302 редирект или временное перенаправление говорит ПС, что страница перемещена временно, поэтому индексировать нужно обе страницы, старую и новую.
1
2
| RewriteEngine on Redirect 302 /old-page http: //ваш-урл.ру/new-page |
Код абсолютно такой же, как в случае с постоянным перенаправлением.
302 редирект удобно использовать, когда проводятся какие-либо долгосрочные работы на сайте и не нужно показывать посетителям «поломанные» страницы. В таком случае вам поможет этот код:
302 редирект удобно использовать, когда проводятся какие-либо долгосрочные работы на сайте и не нужно показывать посетителям «поломанные» страницы. В таком случае вам поможет этот код:
1
2
3
4
| RewriteEngine on RewriteCond %{REQUEST_URI} !/inside.html$ RewriteCond %{REMOTE_ADDR} !^123.123.123.123 RewriteRule $ /inside.html [R=302,L] |
Склеиваем сайты с www и без него
Очень плохо, когда сайт доступен по двум адресам, ПС это очень не любят. Склеить это в один адрес поможет код ниже:
1
2
3
4
| Options +FollowSymLinks RewriteEngine On RewriteCond %{HTTP_HOST} ^www.ваш-урл\.com$ [NC] RewriteRule ^(.*)$ http: //ваш-урл.com/$1 [R=301,L] |
В этом примере — главное зеркало это адрес без www. Если необходимо сделать наоборот — поменяйте www местами, сверху уберите, внизу добавьте.
Показ страниц в зависимости от IP
1
2
3
| 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/. За код спасибо Василию Красноженову.
1
2
3
4
| 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, спамерам или еще кому нехорошему.
1
2
3
| Order Allow,Deny Allow from all Deny from 192.168.0.1 |
Добавлять IP в список можно просто добавляя последнюю строку и меняя там адрес на нужный.
Противоположная ситуация, когда всем нужно запретить, кроме некоторых IP, тогда используем такой код:
Противоположная ситуация, когда всем нужно запретить, кроме некоторых IP, тогда используем такой код:
1
2
3
| Order Deny,Allow Deny from all Allow from 192.168.0.1 |
Добавлять адреса аналогично предыдущему примеру.
Запрещаем просмотр нежелательным User-Agent
Каждый браузер или приложение, которое запрашивает страницу, так или иначе имеет идентификатор — User-Agent. Можно запретить просмотр нежелательным товарищам. Это могут быть как программы, сканирующие сайты, так и старые браузеры, от поддержки которых вы целиком отказались. Ситуации бывают разные.
1
2
3
4
5
6
7
| 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 вы можете найти на сайте http://www.user-agents.org/
Запрещаем доступ к определенному файлу
В примере стоит запрет на доступ к файлам wp-config и htaccess, тем самым повышается уровень общей защиты. Очень нужная директива, рекомендую добавить в свои файлы
01
02
03
04
05
06
07
08
09
10
| # защищаем 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 файлы, которые используются плагинами:
1
2
3
4
| <Files ~ "\.(js|css)$"> order allow,deny allow from all </Files> |
Скачивание определенных типов файлов
Современные браузеры такие умные, что иногда становится страшно. Мой Хром иногда пытается внутри себя открывать для просмотра PDF файлы, иногда вешаясь насмерть. С помощью htaccess можно принудительно сказать браузеру, что делать с тем или иным типом файлов, не оставляя этот момент на его усмотрение. В данном случае это скачивание. Дополнительные типы файлов можно добавить по аналогии.
1
2
3
| AddType application/octet-stream .pdf AddType application/octet-stream .zip AddType application/octet-stream .avi |
Ограничение на доступ к админке WordPress
Если у вас постоянный IP адрес, можно только ему давать доступ к админ-панели WordPress
1
2
3
4
5
6
7
8
9
| 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 создает, по умолчанию, индексные файлы, в которых перечисляется, какие файлы в папке находятся. Если вы не хотите давать дополнительную лазейку для злоумышленников — запретите индексирование.
1
| Options -Indexes |
Включаем gzip сжатие
Вы знаете о том, что данные на сервере можно сжать, а клиент их распакует у себя? Код ниже как раз включает такую штуку. Нужно только убедиться, что gzip разрешен на вашем хостинге, но обычно он есть.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| <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
Ходят слухи, что с помощью этого мода сжимать данные лучше и сайт работает быстрее. Я не могу протестировать, да и не встречал в Интернете подобных тестов. Если у кого есть такая информация — буду благодарен. А код выложу, мало ли
1
2
3
4
5
| <ifmodule mod_deflate.c=""> <filesmatch ".(js|css)$"=""> SetOutputFilter DEFLATE </filesmatch> </ifmodule> |
Включаем кэширование браузера клиента
Интересная директива, которая позволяет использовать кэширование браузера. Указанные типы файлов записываются в кэш браузера и при повторном вызове будут грузиться оттуда, что существенно ускоряет общую скорость загрузки сайта и дает меньшую нагрузку на ваш хостинг.
01
02
03
04
05
06
07
08
09
10
11
12
| Header append Cache-Control " private " 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 и делает это хорошо, но чтобы гарантированно избежать проблем с кодировкой — укажите ее принудительно, хуже не будет точно.
1
| AddDefaultCharset UTF-8 |
Ограничиваем число подключений к сайту
Современные браузеры умеют создавать несколько одновременных подключений к серверу, отдающему сайт. Если же у вас маловато ресурсов, можно ограничить число подключений.
1
| MaxClients <количество подключений> |
При размещении в корневом каталоге, директива работает на весь сайт, если же положить ее в папку с файлами, которые вы отдаете на скачивание — можно ограничить скачивание в несколько потоков.
Разрешаем выполнение php внутри JavaScript
Иногда необходимо выполнить некоторый код внутри скрипта. Этот код поможет включить эту функцию
1
2
3
4
5
| 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/. Там все просто, удачного дня
0 коммент.:
Отправить комментарий