20+ правил .htaccess, которые должен знать каждый разработчик
25-01-2010 | Автор: Yaroslav.CH | Просмотров: 5,543
Рубрика: Конфигурация Web-сервера
Метки: Разработчику
53

Представляю вашему вниманию — подборку правил для .htaccess, собранную автором JP в блоге DevMoose — с моими комментариями и дополнениями.
Обсуждение — приветствуется!
При правильном использовании, конфигурационный файл web-сервера Apache — .htaccess (hypertext access) представляет собой очень мощное средство в инструментарии разработчика. По-обыкновению, основной файл располагается в корневой директории вашего web-сервера (также могут присутствовать отдельные файлы в каждой папке — для управления доступом) и может быть откорректирован с помощью любого текстового редактора. В этой статье я покажу вам 20 правил для .htaccess и поясню для чего их использовать.
Прежде чем мы начнем, обращаю ваше внимание на тот факт, что злоупотребление использованием .htaccess может привести к снижению производительности вашего сайта. Использовать .htaccess для реализации той или иной задачи стоит только в том случае, если нет других вариантов.
Кроме того, помните — работоспособность указанных ниже правил зависит от настроек вашего web-сервера, заданных хостером. Некоторые директивы могут быть запрещены и не работать.
Файл .htaccess может быть размещён в любом каталоге. Директивы этого файла действуют на все файлы в текущем каталоге и во всех его подкаталогах (если эти директивы не переопределены директивами нижележащих файлов .htaccess).
Для того чтобы эти файлы .htaccess можно было использовать, необходимы соответствующие настройки главного конфигурационного файла (значение директивы AllowOverride должно быть установлено All). Как правило, подавляющее большинство хостеров разрешают использовать свои файлы .htaccess.1. Запрещаем загрузку файлов с внешних сайтов
Вам надоели люди, которые размещают картинки, опубликованные на вашем сайте — на своих ресурсах, тем самым расходуя ваш траффик и создавая ненужную нагрузку на ваш хостинг? Данный код, размещенный в конца вашего файла .htaccess, позволит предотвратить загрузку ваших изображений — сторонними сайтами.
Options +FollowSymlinks
#Запрещаем загрузку файлов с внешних сайтов
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?domainname.com/ [nc]
RewriteRule .*.(gif|jpg|png)$ http://domainname.com/img/stop_stealing_bandwidth.gif[nc]
2. Блокируем все запросы от нежелательных User Agents
Это правило позволяет заблокировать нежелательные 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] SetEnvIfNoCase user-Agent ^Offline.Explorer [NC,OR] SetEnvIfNoCase user-Agent ^[Ww]eb[Bb]andit [NC,OR] SetEnvIfNoCase user-Agent ^Zeus [NC] <limit get="" post="" head=""> Order Allow,Deny Allow from all Deny from env=bad_bot </limit>
3. Запрещаем доступ для всех, кроме указанных IP-адресов
Если по какой-либо причине, вы хотите запретить всем или разрешить только отдельным IP-адресам доступ к вашему сайту — добавьте этот код в ваш .htaccess-файл:
#Запрещаем доступ для всех, кроме указанных IP-адресов ErrorDocument 403 http://www.domainname.com Order deny,allow Deny from all Allow from 124.34.48.165 Allow from 102.54.68.123
4. Настраиваем SEO-Friendly 301 Redirect
Если вы перенесли доменное имя или хотите перенаправлять пользователя на определенную страницу (страницы), без санкций со стороны поисковых машин, используйте этот код:
#Настраиваем SEO-Friendly 301 Redirect Redirect 301 /d/file.html http://www.domainname.com/r/file.html
5. Создаем собственные страницы ошибок
Вам надоел стандартный вид страниц ошибок? Нет проблем — с помощью следующего кода, вы легко можете создать свою страницу и показывать пользователю именно ее:
ErrorDocument 401 /error/401.php ErrorDocument 403 /error/403.php ErrorDocument 404 /error/404.php ErrorDocument 500 /error/500.php
6. Создаем черный список IP адресов
Устали от спам-комментариев или определенного пользователя? Просто заблокируйте его IP с помощью следующего кода, добавляемого в .htaccess-файл.
#Создаем черный список IP адресов allow from all deny from 145.186.14.122 deny from 124.15.
7. Устанавливаем e-mail адрес по-умолчанию для администратора сервера
Используйте данный код, для того, чтобы установить e-mail адрес по-умолчанию для администратора сервера.
#Устанавливаем e-mail адрес по-умолчанию для администратора сервера ServerSignature EMail SetEnv SERVER_ADMIN default@domain.com
8. Защищаем определенный файл
Нижеследующий код позволяет вам запретить доступ к любому файлу — при запросе будет выдаваться ошибка 403. Для примере я закрыл доступ к самому файлу htaccess, повысив уровень безопасности сайта.
#Защищаем .htaccess файл <files .htaccess=""> order allow,deny deny from all </files>
9. Сжимаем элементы с помощью mod_deflate
В качестве альтернативы компрессии файлов с помощью Gzip, вы можете использовать mod_deflate (предположительно работает быстрее). Разместите следующий код в начале вашего файла .htaccess (также вы можете добавить .jpg|.gif|.png|.tiff|.ico):
#Сжимаем элементы с помощью mod_deflate <ifmodule mod_deflate.c=""> <filesmatch .(js|css)$=""> SetOutputFilter DEFLATE </filesmatch> </ifmodule>
10. Добавляем срок жизни в заголовки
Данный код позволяет добавить сроки жизни в заголовки:
#Добавляем срок жизни в заголовки <filesmatch .(ico|pdf|flv|jpg|jpeg|png|gif|swf)$=""> Header set Expires "Wed, 21 May 2010 20:00:00 GMT" </filesmatch>
11. Устанавливаем страницы по-умолчанию
Обычно страницей по-умолчанию является index.html, однако с помощью этого кода вы можете настроить по-умолчанию любую другую страницу.
#Устанавливаем альтернативную страницу по-умолчанию DirectoryIndex about.html
12. Защищаем паролем папки и файлы
Вы можете включить проверку пароля для доступа в любую папку или файл на вашем сервере, используя этот код:
#защита паролем файла <files secure.php=""> AuthType Basic AuthName "Prompt" AuthUserFile /pub/home/.htpasswd Require valid-user </files> # защита паролем папки resides AuthType basic AuthName "This directory is protected" AuthUserFile /pub/home/.htpasswd AuthGroupFile /dev/null Require valid-user
Однако в этом случае пароли будут хранится в открытом виде, что не слишком хорошо с точки зрения безопасности. Поэтому оптимальнее пароль зашифровать. Для этого воспользуйтесь сервисами генерации записей в файлы .htpasswd. Например, вот таким.
В нашем примере файл с паролями доступа лежит в корневой директории сайта и называется .htpasswd. Директория указывается от корня сервера и если путь будет некорректным — Apache, не получив доступа к файлу, откажет в доступе к папке любому пользователю — в том чилсе и тому, который ввел правильную пару логин:пароль.
13. Перенаправляем со старого домена — на новый
Используя .htaccess, вы можете настроить перенаправление со старого доменного имени на новое, добавив следующий код:
#Перенаправляем со старого домена - на новый RewriteEngine On RewriteRule ^(.*)$ http://www.domainname.com/$1 [R=301,L]
14. Усиливаем кеширование
Использование этого правила не означает прямое ускорение загрузки вашего сайта. Оно предназначено для более быстрой загрузки сайта — для уже заходившего на него посетителя, путем отправки статуса 304 для тех элементов, которые не обновлялись. Таким образом, при повторной загрузке страницы браузер посетителя не будет заново скачивать изображения, скрипты или CSS, а выведет те файлы, которые уже хранятся в его кеше. Вы можете изменить срок жизни кеша, путем корректирования его значения в годах (year), месяцах (month) или, например — секундах (seconds). В примере указан 1 год.
#Усиливаем кеширование FileETag MTime Size <ifmodule mod_expires.c> <filesmatch ".(jpg|gif|png|css|js)$"> ExpiresActive on ExpiresDefault "access plus 1 year" </filesmatch> </ifmodule>
15. Сжимаем компоненты сайта путем включения Gzip
При использовании Gzip, сервер будет сжимать файлы перед отправкой их пользователю, ввиду чего ваш сайт будет грузиться быстрее.
#Сжимаем компоненты сайта путем включения Gzip AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4.0[678] no-gzip BrowserMatch bMSIE !no-gzip !gzip-only-text/html
16. Удаляем «category» из URL
Для изменения ссылки http://yourdomain.com/category/blue на http://yourdomain.com/blue, просто добавьте следующий код в конце вашего .htaccess файла.
#Удаляем category из URL RewriteRule ^category/(.+)$ http://www.yourdomain.com/$1 [R=301,L]
17. Запрещаем просмотр содержимого папки
Для того, чтобы ограничить доступ к директориям, которые могут содержать разнообразную информацию и для обеспечения безопасности сервера, добавьте этот код в файл .htaccess
#Запрещаем просмотр содержимого папки Options All -Indexes
Update: Jack.Sun предложил альтернативное решение, имеющее такой же результат — разместить в каждой папке файл index.html. От себя добавлю, что этот метод будет работать только в том случае, если вы не изменяли страницу по-умолчанию (см. правило #11). В этим случае, необходимо размещать файлы с тем новым именем, которое было задано вами в качестве страницы по-умолчанию.
18. Перенаправляем RSS-ленту WordPress на FeedBurner
Этот код позволяет перенаправить RSS-ленту WordPress на сервис Google Feedburner.
#Перенаправляем RSS-ленту WordPress на FeedBurner
<ifmodule mod_rewrite.c="">
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !FeedBurner [NC]
RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds.feedburner.com/yourfeed [R=302,NC,L]
</ifmodule>
19. Запрещаем комментарии от пользователей без Referrer
Чаще всего спам-боты обращаются напрямую к файлу wp-comments-post.php, не заходя на страницы записей вашего блога. Приведенный ниже код позволяет заблокировать комментарии, отправленные пользователями, которые пришли «из ниоткуда», позволяя комментировать тем читателям, которые перешли на страницу вашего блога с каких-либо других страниц (например, результатов поиска Google).
#Запрещаем комментарии от пользователей без Referrer
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
RewriteCond %{HTTP_REFERER} !.*yourblog.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
20. Убираем расширение файла из URL
Данный код позволяет удалить расширение файла .php (вы можете изменить его на любое другое, например — .html) из URL-адресов страниц.
#Убираем расширение файла из URL RewriteRule ^(([^/]+/)*[^.]+)$ /$1.php [L]
21. Защищаем сайт
Данный код позволяет защитить сайт от scripts enjection и нежелательных модификаций _REQUEST и/или GLOBALS
#Включаем отслеживание сим-ссылок
Options +FollowSymLinks
#Запускаем url_rewriting
RewriteEngine On
#Блокируем все ссылки, содержащие <script>
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
#Блокируем все скрипты, которые пытаются изменить переменные PHP Globals:
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
#Блокируем все скрипты, которые пытаются изменить переменную _REQUEST:
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
#Перенаправляем все подобные на страницу с ошибкой 403 - запрещено
RewriteRule ^(.*)$ index.php [F,L]
Источник: WPRecipes.
22. Перенаправляем посетителя с помощью директивы RedirectMatch и регулярных выражений
Еще одна полезная директива, рекомендуемая к использованию Хайпер - RedirectMatch. Цитата из комментариев: «Директива позволяет в качестве запрашиваемого адреса использовать регулярное выражение (пересылка не «с документа», а «со всех документов, типа ...»). Редирект внешний — браузеру сообщается о необходимости загрузить другую страницу.
Синтаксис:
RedirectMatch [status] regexp URL
Значения статусов (код возврата веб-сервера) стандартные: permanent (301 — постоянный редирект), temp (302 — временный редирект, приходите ещё), seeother (303 — летим туда, там много вкусного), gone (410 — удалён навсегда).
Пример. То же перенаправление со старого домена на новый без подключения RewriteEngine:»
RedirectMatch 301 ^(.*)$ www.domainname.com/$1
От себя добавлю, что вы можете использовать не только статусы, но и другие условия:
RedirectMatch (.*)\.gif$ http://www.myserver.com$1.png RedirectMatch (.*\.jpg)$ http://www.myanother.com$1
А какие правила знаете вы? Напишите их в комментариях и они будут добавлены в статью с указанием ссылки на сайт автора.

у меня тут вопросик получился при использовании htaccess:
а можно где нить типа галочку сделать, чтоб он не сохранял в компе пароль по желанию
а то так получается один раз с чужого компа ввел и потом пароль менять?
а так все работает спасибо )))
@Антон: пароль сохраняется только в том случае, если указать его сохранять. Но этот момент не относится к .htaccess — это уже функции самого браузера.
Если у Вас Firefox, Chrome или Opera — в настройках можно удалить сохраненный пароль.
Очень полезная и актуальная статья. Добавил в закладки. Спасибо!
Здравствуйте, автору огромное спасибо. У меня вопрос такой, я перевела сайт на новый домен и через месяц примерно удалила сайт со старым доменом. Но вот беда, новый сайт Яндекс перестал индексировать, я так думаю, потому что никто по Яндексу не заходит, на старый блог он приводил посетителей. если я пропишу в этом файле #Перенаправляем со старого домена — на новый RewriteEngine On RewriteRule ^(.*)$ www.domainname.com/$1 [R=301,L] то есть надежда, что Яндекс проиндексирует новый и люди будут приходить на новый блог? И как вы думаете, почему Яндекс новый домен не полюбил? Домену почти 2 месяца, постоянно обновляется и авторский контент.
@Ляйсан Шагалиева:
Не совсем понятно, что имеется ввиду «перестал индексировать»? А раньше он индексировался? Если да, то редирект ничем не поможет.
Перенаправление есть смысл ставить в том случае, если в Яндексе есть ссылки на страницы старого блога или на других сайтах присутствуют ссылки на старый блог. В этом случае, пользователи со старого домена будут попадать на новый. Для робота редирект полезен более быстрым процессом переидексации нового сайта. Но если сайт уже есть в выдаче и выпал из него, или же не индексируются новые страницы — это уже другой разговор.
А отсутствие посещений, в принципе, не обязательно связано с отсутствием сайта в выдаче — могут быть просто слабые позиции.
Если Вы говорите о том блоге, что указан по ссылке на имени комментатора — то он есть в Яндексе и нормально индексируется. Но для того, чтобы проверить — добавьте блог в панель Яндекс.Вебмастер и, подтвердив право владения, подождите получения статистики.
Вопрос на засыпку — можно ли както защитить паролем через .htpasswd такую ссылку http://какойто_сайт/?module=admin, но при этом чтобы остальные ссылки типа http://какойто_сайт/?controller=Rubric&rubric_id=14&h=1 не защищались?
пасибо за подборку. Очень полезно, страничку в букмарки.
Большое спасибо за статью, Ярослав. Я перевел свой блог из одного поддомена в другой и хотел сделать грамотное перенаправление, так как раньше в постоянных ссылка у меня фигурировали названия категорий, а в новой версии блога я их убрал (чем глубже папка, тем меньше PR — думаю верное мнение). Перерыл кучу ресурсов по .htaccess. Везде одно и тоже, но ответ на свой вопрос я нашел только в этой статье!
А подскажите насчет 3 пункта (блокировки) если я хочу что-бы мой сайт был виден только в локальной сети, мне нужно прописать все адреса??? Или можно использовать шаблон? Например адреса в сети 10.10.10.*** Как лучше сделать,сайт построен на joomla
@Саня: нет, в этом случае нужно прописать блокировку для всех адресов, кроме Вашего IP. Однако нужно учесть, что этот IP должен быть статичным.
С другой стороны, не вижу смысла выкладывать сайт в публичный доступ для того, чтобы его закрыть для всех. Оптимальнее развернуть локальный web-сервер в своей же сети — без выхода в мир — и ходить на сайт как на внутренний ресурс.