20+ вариантов использования .htaccess

  • Содержание

Файл конфигурации .htaccess может быть очень мощным инструментом разработчика при его правильном использовании. Его можно найти в корневой папке сервера, редактируется обычным текстовым редактором. В этой статье вы увидете более 20 .htaccess хаков и способы их применения.

Прежде чем перейти к возможностям .htaccess, хочу сказать, что чрезмерное злоупотребление .htaccess может снизить производительность вашего сайта. Следует использовать .htaccess, только если нет другого способа решить задачу.

Сделайте резервную копию вашего файла, прежде чем вносить изменения.

1. Ограничение доступа с других сайтов

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

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-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 адресов, следующий код для вас.

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. 301 редиректы для поисковых роботов

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

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 бан-лист

Кто-то постоянно оставляет комментарии в вашем блоге? Запретите надоедливого пользователя с помощью этих строчек.

allow from all
deny from 145.186.14.122
deny from 124.15

7. Email администратора

Следующий код устанавливает адрес электронной почты администратора вашего сервера.

ServerSignature EMail
SetEnv SERVER_ADMIN default@domain.com

8. Отменить запрос об открытии файла

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

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

9. Защитить отдельный файл

Следующий код позволяет вам отказать в доступе к любому файлу. Сервер выдаст ошибку 403 всем, кто попытается открыть файл. Пример показывает, как защитить .htaccess файл.

<Files .htaccess>
order allow,deny
deny from all
</Files>

10. Сжатие с mod_deflate

Наряду с Gzip архивированием файлов, вы можете использовать mod_deflate (что предположительно быстрее). Поместите указанный код в начало вашего .htaccess файла (вы также можете добавить картинки .jpg, .gif, .png, .tiff, .ico).

<IfModule mod_deflate.c>
<FilesMatch ".(js|css)$">
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>

11. Добавление заголовка Expires

Представленный код показывает, как добавить информацию о времени жизни файла.

<FilesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
Header set Expires "Wed, 21 May 2010 20:00:00 GMT"
</FilesMatch>

12. Страница по умолчанию

Вы можете установить страницу по умолчанию для любой директории. Пример ниже устанавливает about.html вместо index.html.

DirectoryIndex about.html

13. Защита паролем

Вы можете включить аутентификацию любой директории или файла на вашем сервере.

# защита файла
<Files secure.php>
AuthType Basic
AuthName "Prompt"
AuthUserFile /home/path/.htpasswd
Require valid-user
</Files>

# защита директории
AuthType basic
AuthName "This directory is protected"
AuthUserFile /home/path/.htpasswd
AuthGroupFile /dev/null
Require valid-user

14. Перенос на новый домен

Используя .htaccess, вы можете перенаправить пользователей на новый домен.

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

15. Кеширование

Представленный ниже код не увеличит время загрузки файлов сервера. Единственное, что изменится, - контент будет загружаться быстрее для пользователей, которые уже были на сайте. Вы можете изменить срок действия кеша, изменив число секунд (в сутках 86400 секунд).

FileETag MTime Size
ExpiresActive on
ExpiresDefault "access plus 86400 seconds"

16. 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

17. Убрать папку с URL

Чтобы http://yourdomain.com/category/blue изменить на http://yourdomain.com/blue, добавьте строчку в ваш .htaccess.

RewriteRule ^category/(.+)$ http://www.yourdomain.com/$1 [R=301,L]

18. Disable Directory Browsing

Чтобы запретить пользователям просматривать содержимое папок, используйте код ниже. Эта информация может быть весьма ценной для злоумышлеников. Чтобы открыть доступ, замените минус на плюс.

Options All -Indexes

19. Редирект WordPress фида на 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>

20. Защита от ботов

Данный пример для пользователей WordPress. При добавлении комментария сервер сравнивает заголовок Referer с "wp-comments-post.php". Если он не совпадает, комментарий не добавится.

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]

21. Удалить расширение файла из URL

Представленный ниже код удаляет расширение .php (можете задать html) из строки адреса. Обновленный код поисковикам понравится больше.

RewriteRule ^(([^/]+/)*[^.]+)$ /\$1.php [L]

22. Добавить www в строку адреса

Если вы хотите, чтобы в адресе вашего сайта присутствовал префикс www, добавьте следующие строчки.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

23. Убрать www из строки адреса

Для решения обратной задачи, используйте такой код.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule (.*) http://example.com/$1 [R=301,L]

24. Запретить прямой доступ к сайту

Если нужно разрешить доступ на страницу только тем, кто перешел на сайт по ссылке, используйте следующие строчки кода.

RewriteEngine on
RewriteCond %{HTTP_REFERER} ^$
RewriteRule ^.*$ - [F]

Необходимо ограничить сайты рефералы? Запишите их в RewriteCond.

Источник.

Понравилась статья? Подпишись на RSS.

Советую почитать:

Документация Nginx в PDF формате

Ограничить область видимости HTML + JSON

Комментарии

  • inst написал 24 января 2010 года

    Подскажите, если не трудно, рабочий вариант совета №9 с точностью до наоборот, т.е. надо разрешить клиентам доступ только к одному файлу из всей директории (в последствии - группе файлов со сходными именами).

    Ответить
  • Александр написал 24 января 2010 года

    Резрешить доступ к файлам с расширениями htm, html, css, js, php

    order allow,deny
    deny from all
    <FilesMatch "\.(htm|html|css|js|php)$">
    allow from all
    </FilesMatch>
    Ответить
  • inst написал 26 апреля 2010 года

    Спасибо =)

    Ответить
  • Allpa написал 11 января 2012 года

    А разрешить доступ только к одной папке (и ко всем вложенным файлам) можно? Если да, то как?
    Спасибо!

    Ответить
  • Александр написал 12 января 2012 года
    order allow,deny
    deny from all
    <Directory /path/to/folder/>
    allow from all
    </Directory>
    Ответить
  • abuser написал 24 апреля 2010 года

    а вот такой вопрос:
    нужно при обращении на сервак за картинкой - редиректить на картинку, а при любом-другом обращении - на др сайт\папку ... т.е. что-то типо:
    if *.gif then http://domain.com/pict.gif
    else http://google.com/index.php
    как  это реализовать на хтаксессе ??

    Ответить
  • Александр написал 24 апреля 2010 года
    RewriteEngine on
    RewriteRule !(.*\.gif)$ http://www.google.ru/ [NC,L]
    Ответить
  • Polya написал 27 апреля 2010 года

    спс за статейку... очень помогла =))

    Ответить
  • kostik34 написал 22 июля 2010 года

    Здравстыуйте, подскажите пожалуйста, как правильно сделать gzip сжатие? Код из примера 16 втавить в htaccess, а дальше что? С файлами css и js нужно что-то делать? Или они сами заархивируются?

    Ответить
  • Александр написал 11 сентября 2010 года

    Не нужно самому архивировать статические файлы, сервер сам их передаст в заархивированном виде

    Ответить
  • Русский волк написал 10 сентября 2010 года

    Подскажите, как сделать баннер на все свои сайты, как на народе. Говорят, что через htaccess можно, но ничего не нашел.

    Ответить
  • Александр написал 11 сентября 2010 года

    Вставить код баннера на всех страницах, причем тут htaccess?

    Ответить
  • Оксана. написал 06 ноября 2010 года

    Подскажите, пожалуйста, как в htaccess не запретить страны, а наоборот разрешить только определенные страны. Мне нужны только Россия, Белоруссия и Украина. Ну и конечно же поисковики.

    Ответить
  • Александр написал 07 ноября 2010 года

    Если нужно ограничить доступ для всех, кроме ..., используйте прием как в пункте 3

    Ответить
  • Denn написал 09 ноября 2010 года

    Привет. Нужно запретить доступ на сайт ко всем папкам, кроме одной папки, как это правильно прописать?
    Спасибо.

    Ответить
  • Александр написал 12 ноября 2010 года

    Используйте mod_rewrite

    RewriteEngine On
    RewriteRule !folder [F]
    Ответить
  • Vitt написал 11 ноября 2010 года

    Подскажите, пожалуйста как запретить прямой
    доступ к URL через строку браузера, а доступ через
    конструкцию - [removed][removed] разрешить?

    Можно, ли это реализовать через .htaccess?

    Ответить
  • Vitt написал 11 ноября 2010 года

    ... через конструкцию - script scr=URL

    Ответить
  • Александр написал 11 ноября 2010 года

    Посмотрите первый пример. Подключаемые к странице файлы будут иметь HTTP_REFERER - адрес страницы.

    Ответить
  • Ерзин написал 09 января 2011 года

    Подскажите пожалуйста почему по правилу не работает удаление расширений .php и .html из адресной строки?
    пишу:

    RewriteEngine on
    RewriteRule ^(([^/]+/)*[^.]+)$ /.php [L]
    RewriteRule ^(([^/]+/)*[^.]+)$ /.html [L]
    Ответить
  • Александр написал 11 января 2011 года

    Парсер съел доллар, запишите правило так:
    RewriteRule ^(([^/]+/)*[^.]+)$ /$1.php [L]

    Правило преобразует запрос вида /test в /test.php

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

    Нельзя применить одновременно те два правила, которые вы записали выше - сработает только первое.

    Ответить
  • Ерзин написал 13 января 2011 года

    Спасибо за пояснение!
    А вот почему у меня не работает 17 правило? или опять что то не так пишу?
    имеется ссылка http://www.erzin.com/docs/word/ которую хочу преобразовать в http://www.erzin.com/word/ , а правило не срабатывает

    RewriteRule ^docs/(.+)$ http://www.erzin.com/ [R=301,L]
    Ответить
  • Александр написал 13 января 2011 года

    На вскидку попробуйте так

    RewriteRule ^docs/(.+)$ /\$1 [R=301,L]

    Смотрите логи Apache, там все написано.

    Ответить
  • Ерзин написал 09 января 2011 года

    А кстати как правильно переадресовать директорию www.site.ru/folder/ на подходящий файл в этой директории (если .htaccess находится в корне сайта, а не в папке folder)?

    Ответить
  • Евгений написал 11 января 2011 года

    Привет программистам! :)
    вот вопросик в вам
    в директории /vybor/ содержится 5 файлов (step1.php, step2.php, step3.php, step4.php, step5.php,). И необходимо, если пользователь наберет в браузерной строке адрес http://mysite.com/vybor/step2.php или http://mysite.com/vybor/step3.php и пр., то его перенаправляло на http://mysite.com/vybor/step1.php.
    как это реализовать?

    Ответить
  • Александр написал 11 января 2011 года

    Вам точно нужен серверный редирект? В этом случае на страницы step2.php и т.д. вообще не получится перейти.
    Скорее всего, вам нужен header('Location: ') в зависимости от сессии.
    Если я вас не убедил, используйте Redirect (пункт 4)

    Ответить
  • Евгений написал 12 января 2011 года

    А если модифицировать 24-е правило под страницы step2.php…step5.php. чтобы на них прямой доступ (из адресной строки) был запрещен а только через последовательность выполняемых шагов (step1.php -> step2.php -> ... -> step5.php)
    Если нет такой возможности, тогда уж попробую в php коде условия посоздавать

    Ответить
  • Александр написал 13 января 2011 года

    Могу порекомендовать решения с jQuery
    Formwizard
    jQuery Form to Form Wizard
    Fancy Sliding Form

    Ответить
  • Алексей написал 31 января 2011 года

    Помогите - нужно срочно решить вопрос.
    Редирект всех страниц сайта(статики и динамических(с get параметрами) - на другой домен БЕЗ ПАРАМЕТРОВ и только на главную страницу.
    Т.е. ссылки вида:
    domain1.ru/ttt.php?id=3
    domain1.ru/lll.php?sid=10992&per=LkOp9Utd
    Редиректились на:
    domain2.ru (только на морду, без всяких параметров)
    ——————
    заранее спасибо!

    Ответить
  • Александр написал 31 января 2011 года
    RewriteEngine on
    RewriteCond %{QUERY_STRING} .+
    RewriteRule .* http://example.com/ [R=301,L]
    Ответить
  • Алексей написал 19 февраля 2011 года

    Спасибо! Но так все-равно передаются параметры. Бился 2 дня, в итоге сработало только так:
    ———
    RewriteEngine On
    RewriteRule .* http://mysite.ru/? [R=301]
    ———
    Обязательно без параметра "L" - иначе передает параметры(причем все, что после "?")

    Есть вероятность, что это особенность настройки хоста(у хостера Qwarta)...

    Ответить
  • Дмитрий написал 31 января 2011 года

    Здравствуйте. Конечно не в тему, но возможно есть ответ. как можно сделать так, чтобы форум, открывающийся по адресу site/ru/forum открывался и был постоянно по ссылке forum.site.ru

    З.ы. forum в самом движке, поэтому направить на папку forum на сервере не получится...

    Ответить
  • Вадим написал 17 января 2012 года

    Субдомен создай forum - и всё)

    Ответить
  • Monte написал 18 марта 2011 года

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

    на php это выглядит вот так:

    $f= '/home/mylogin/1/любая_folder/любой_file' ;
    if (is_dir($f)|| is_file&#40;$f&#41;|| is_link($f)){
          $f= '/home/mylogin/2/любая_folder/любой_file' ;
    } 

    и при этом запрос $_GET сохранялся.
    заранее спасибо

    Ответить
  • Monte написал 18 марта 2011 года

    $f= '/home/mylogin/1/любая_folder/любой_file' ;
    if (is_dir($f)|| is_file&#40;$f&#41; || is_link($f)){
        $f= '/home/mylogin/2/любая_folder/любой_file' ;
    }

    Ответить
  • Александр написал 18 марта 2011 года

    То есть, если http://example.com/page1/?id=1 не существует, то перейти на http://example.com/page2/?id=1, который существует?

    Ответить
  • Monte написал 18 марта 2011 года

    $f= '/home/mylogin/1/любая_folder/любой_file' ;
    if (is_dir($f)|| is_file&#40;$f&#41; || is_link($f)){
        $f= '/home/mylogin/2/любая_folder/любой_file' ;
    }

    Ответить
  • Alex написал 07 октября 2011 года

    Подскажите пожалуйста, почему у меня не работает вот это правило RewriteRule ^(([^/]+/)*[^.]+)$ /\$1.php [L]

    Ответить
  • Александр написал 31 октября 2011 года

    Добрый день.
    Подскажите пожалуйста как мне скрыть из адреса страницы get переменные, то есть у меня есть ссылка
    http://poddomen.site.com/news.php?lan=1
    я её хочу заменить на такую
    http://poddomen.site.com/news-1
    Заранее спасибо, Александр.

    Ответить
  • Сергей написал 04 марта 2012 года

    А как запретить доступ с определенных сайтов у которых передаваемый реферрер engine.php, так же с сайтов у которых расширение .ru, ua?

    Ответить
  • Abdu Jan написал 27 марта 2012 года

    Привет всем..
    Я хочу убрать расширения файла .php
    Вставил следующий код:

    RewriteRule ^(([^/]+/)*[^.]+)$ /\$1.php [L]


    и сохранил как .htaccess
    Но когда открываю сайт там у меня показывает расширения.. Что нужно сделать ?

    Ответить
  • Александр написал 31 марта 2012 года

    Это правило преобразует запрос вида /test в /test.php

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

    Ответить