Приятного чтения!

← назад
.htaccess. Возможности и настройки

.htaccess. Возможности и настройки

calendar_today25.02.2024 visibility31

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

Что такое файл .htaccess?

.htaccess – файл дополнительной конфигурации веб-сервера Apache. Позволяет задавать большое количество параметров и разрешений для работы веб-сервера у отдельного пользователя, при этом не влияя на работу сервера в целом.

Директивы файла .htaccess действуют для каталога, в котором размещён такой файл, и для всех его подкаталогов. Если вы желаете с помощью .htaccess изменить настройки для сайта в целом, его следует размещать в корневом каталоге сайта ~/ваш_домен/www (или другой каталог, который предусмотрен для страниц сайта на вашем сервере, например, public_html, docs и т.п.).

Пожалуйста, будьте внимательны при редактировании файла .htaccess! При сохранении такого файла в кодировке UTF-8 в нём не должно присутствовать BOM-сигнатуры. Для редактирования файла .htaccess и других конфигурационных файлов рекомендуется использовать не «Блокнот» Windows, а специальные текстовые редакторы, например Notepad++.

Что можно изменить файлом .htaccess?

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

Примеры настройки сайта с помощью .htaccess

1. Перенаправление доменов c синонима сайта на основной домен с кодом 301

Перенаправить запросы на domain.ru с любого из синонимов сайта

RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain\.ru$ [NC]
RewriteRule ^(.*)$ http://domain.ru/$1 [L,R=301]

Перенаправить запросы на www.domain.ru с любого из синонимов сайта

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.domain\.ru$ [NC]
RewriteRule ^(.*)$ http://www.domain.ru/$1 [L,R=301]

Эти правила рекомендуется размещать в самом начале файла .htaccess.

2. Постоянное перенаправление с кодом 301

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

Redirect 301 /page.html http://www.domain.ru/new_page.html

где:

  • page.html - адрес старой страницы относительно корня сайта;
  • www.domain.ru - имя сайта;
  • new_page.html - адрес страницы, на которую нужно выполнить перенаправление.

Подобное правило не сработает для перенаправления с адресов, содержащих Query String (символы после ?). Для запросов, содержащих QUERY_STRING, можно использовать сочетание RewriteCond и RewriteRule.

Например, для перенаправления всех запросов к странице /period/?test=123 вашего сайта на domain.ru, вы можете написать:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{QUERY_STRING} ^test=123$ [NC]
RewriteRule ^period/$ http://domain.ru/ [L,R=301]

3. Переопределение страниц ошибок

При помощи файла .htaccess вы можете установить свои страницы ошибок:

#401 Авторизация не выполнена
ErrorDocument 401 http://domain.ru/errors/401.html
#403 Доступ запрещен
ErrorDocument 403 http://domain.ru/errors/403.html
#404 Страница не найдена
ErrorDocument 404 http://domain.ru/errors/404.html
#500 Внутренняя ошибка сервера
ErrorDocument 500 http://domain.ru/errors/500.html

Соответствующие файлы страниц ошибок (401.html, 404.html и др.) необходимо разместить в каталоге ~/ваш_домен/docs/errors.

Для того чтобы при случайном упоминании прямых ссылок на такие страницы они не проиндексировались в поисковых системах, рекомендуется:

a) в файле ~/ваш_домен/docs/robots.txt прописать

User-agent: *
Disallow: /errors

b) создать файл ~/ваш_домен/docs/errors/.htaccess, в котором прописать

Options -Indexes

4. Постраничное перенаправление запросов на другой домен c кодом 301

Следующий код перенаправит все запросы к страницам вашего сайта на аналогичные страницы другого сайта, например, запрос http://domain.ru/main будет переадресован на http://www.newdomain.ru/main:

Redirect 301 / http://www.newdomain.ru/

либо

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

5. Ограничение доступа к сайту по IP

Запретить доступ к сайту с IP-адресов 123.4.5.6 и 123.5.4.3

Order Allow,Deny
Allow from all
Deny from 123.4.5.6 123.5.4.3

Запретить доступ к сайту со всех адресов кроме 123.4.5.6 и 123.5.4.3:

Order Deny,Allow
Deny from all
Allow from 123.4.5.6 123.5.4.3

Запретить доступ к сайту для всех:

Deny from all

6. Переопределение главной страницы сайта (индексного файла каталога)

Сделать главной страницей файл menu.html:

DirectoryIndex menu.html

7. Включение обработки PHP в .html-файлах

RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml

8. Запрет выдачи листинга каталога

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

Options -Indexes

9. Включить выполнение CGI-скриптов в папке docs для файлов с расширениями .cgi, .pl. .py

В папке c CGI-скриптами необходимо разместить файл .htaccess с содержимым:

AddHandler cgi-script .cgi .pl .py
Options +ExecCGI

Скрипт должен иметь атрибут исполнения (+x, права доступа, начинающиеся с 7, например, 755).

Атрибуты (права доступа) можно изменить с помощью файлового менеджера панели управления, при помощи вашего FTP-клиента или по SSH. Также в разделе Веб-серверУправление модулями должен быть включен модуль CGI.

10. Блокировка переходов со сторонних ресурсов

Для запрета перехода c baddomain.ru на domain.ru добавьте в .htaccess следующее:

RewriteEngine on
RewriteCond %{HTTP_REFERER} baddomain\.ru [NC]
RewriteRule .* - [F]

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

RewriteEngine on
RewriteCond %{HTTP_REFERER} baddomain\.ru [NC,OR]
RewriteCond %{HTTP_REFERER} baddomain2\.ru [NC,OR]
RewriteCond %{HTTP_REFERER} baddomain3\.ru [NC]
RewriteRule .* - [F]

11. Особенности использования кириллических доменов (.РФ, .МОСКВА и др.)

В файле .htaccess использование кириллицы не допускается. При составлении правил перенаправления для кириллических доменов необходимо указывать имя домена в punycode. Узнать имя домена в punycode можно с помощью сервиса Whois.

Например, для перенаправления site.ru на caйт.рф нужно воспользоваться следующим правилом:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.site.ru [NC]
RewriteRule ^(.*)$ http://xn--80aswg.xn--p1ai/$1 [R=301,L]

В этом случае ваши посетители могут увидеть именно punycode-представление доменного имени в адресной строке браузера. Это не является ошибкой.

12. Перенаправление с HTTP на HTTPS и обратно

Для работы перенаправления на сайте должен быть установлен действительный SSL-сертификат.

Перенаправить запросы на https://domain.ru

RewriteEngine on
RewriteCond %{ENV:HTTPS} !on
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Перенаправить запросы на http://domain.ru

RewriteEngine on
RewriteCond %{ENV:HTTPS} on
RewriteRule ^.*$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

13. Блокировка поисковых ботов

Некоторые поисковые роботы создают лишнюю нагрузку на СPU сайта и не несут пользы для его индексирования.

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

Сперва создадим переменные с именами юзер-агентов:

SetEnvIfNoCase User-Agent "Name_of_bot" bad_bot

где вместо Name_of_bot впишите имя юзер-агента бота.

Теперь запишем правило блокирования всех ботов, которых мы определили, как bad_bot

Order Allow,Deny 
Allow from all
Deny from env=bad_bot

14. Настройка кэширования сайта

Для снижения трафика и нагрузки на процессор целесообразно применять методы сжатия и кеширования. Это значит, что страницы вашего сайта не будут каждый раз запрашиваться у сервера, а будут храниться во временной памяти (в кэше) для обеспечения более быстрого доступа к ним. 

AddHandler application/x-httpd-php .html
AddHandler cgi-script .pl .py .jsp .asp .htm .shtml .sh .cgi
AddType application/x-javascript .js
AddType text/css .css
AddType text/xml .xml
AddType application/octet-stream .doc .mov .avi .pdf .xls
# ForceType application/x-httpd-php
    AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
    #кэшировать html и htm файлы на один день    
        Header set Cache-Control "max-age=43200"   
    #кэшировать css, javascript и текстовые файлы на одну неделю    
        Header set Cache-Control "max-age=604800"    
    #кэшировать флэш и изображения на месяц    
        Header set Cache-Control "max-age=2592000"    
    #отключить кэширование    
        Header unset Cache-Control
    
    ExpiresActive On
    #по умолчанию кеш в 5 секунд
    ExpiresDefault "access plus 5 seconds"
    #кэшировать флэш и изображения на месяц
    ExpiresByType image/x-icon "access plus 2592000 seconds"
    ExpiresByType image/jpeg "access plus 2592000 seconds"
    ExpiresByType image/png "access plus 2592000 seconds"
    ExpiresByType image/gif "access plus 2592000 seconds"
    ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
    #кэшировать css, javascript и текстовые файлы на одну неделю
    ExpiresByType text/css "access plus 604800 seconds"
    ExpiresByType text/javascript "access plus 604800 seconds"
    ExpiresByType application/javascript "access plus 604800 seconds"
    ExpiresByType application/x-javascript "access plus 604800 seconds"
    #кэшировать html и htm файлы на один день
    ExpiresByType text/html "access plus 43200 seconds"
    #кэшировать xml файлы на десять минут
    ExpiresByType application/xhtml+xml "access plus 600 seconds"

15. Настройка сжатия страниц сайта

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

Прежде чем приступить к настройке сжатия сайта, убедитесь, что ваш сервер ещё не использует эту возможность. Это можно сделать через такие сервисы, как WebsitePlanet. Если проверка показала положительный результат, то настраивать ничего не нужно, ваши страницы уже передаются в сжатом виде. В противном же случае, в файл .htaccess добавляем следующие директивы:

AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

16. Защита сервера от исполнения вредоносных PHP-скриптов

Вот правила для файла .htaccess, которые защитят ваш сервер от вредоносных скриптов и инъекций:

# Блокировка XSS
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
# Блокируем выставление переменной PHP GLOBALS через URL
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Блокируем возможность изменять переменную _REQUEST через URL
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Блокировка MySQL инъекций, RFI, base64, и др.
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=https:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR]
RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR]
RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR]
RewriteCond %{QUERY_STRING} ftp\: [NC,OR]
RewriteCond %{QUERY_STRING} http\: [NC,OR]
RewriteCond %{QUERY_STRING} https\: [NC,OR]
RewriteCond %{QUERY_STRING} \=\|w\| [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)/self/(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)cPath=https://(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [OR]
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>).* [NC,OR]
RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR]
RewriteCond %{QUERY_STRING} (\./|\../|\.../)+(motd|etc|bin) [NC,OR]
RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR]
RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR]
RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR]
RewriteCond %{QUERY_STRING} (;|<|>|'|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC,OR]
RewriteCond %{QUERY_STRING} (\\|\.\.\.|\.\./|~|`|<|>|\|) [NC,OR]
RewriteCond %{QUERY_STRING} (boot\.ini|etc/passwd|self/environ) [NC,OR]
RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumb)?)\.php [NC,OR]
RewriteCond %{QUERY_STRING} (sp_executesql) [NC]
RewriteCond %{QUERY_STRING} (eval\() [NC,OR]
RewriteCond %{QUERY_STRING} (127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR]
RewriteRule ^(.*)$ - [F,L]
# Отклонение запросов TRACE|TRACK
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
# Фильтрация URL на служебные символы
RewriteCond %{QUERY_STRING} (<|>|'|\+|%2B|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
# Блокировка известных Shell
RewriteCond %{REQUEST_URI} .*((php|my)?shell|remview.*|phpremoteview.*|sshphp.*|pcom|nstview.*|c99|r57|webadmin.*|phpget.*|phpwriter.*|fileditor.*|locus7.*|storm7.*).(p?s?x?htm?l?|txt|aspx?|cfml?|cgi|pl|php[3-9]{0,1}|jsp?|sql|xml) [NC,OR]
RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
RewriteCond %{QUERY_STRING} ^(.*)=(/|%2F)(h|%68|%48)(o|%6F|%4F)(m|%6D|%4D)(e|%65|%45)(.+)?(/|%2F)(.*)(/|%2F)(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^work_dir=.*$ [OR]
RewriteCond %{QUERY_STRING} ^command=.*&output.*$ [OR]
RewriteCond %{QUERY_STRING} ^nts_[a-z0-9_]{0,10}=.*$ [OR]
RewriteCond %{QUERY_STRING} ^c=(t|setup|codes)$ [OR]
RewriteCond %{QUERY_STRING} ^act=((about|cmd|selfremove|chbd|trojan|backc|massbrowsersploit|exploits|grablogins|upload.*)|((chmod|f)&f=.*))$ [OR]
RewriteCond %{QUERY_STRING} ^act=(ls|search|fsbuff|encoder|tools|processes|ftpquickbrute|security|sql|eval|update|feedback|cmd|gofile|mkfile)&d=.*$ [OR]
RewriteCond %{QUERY_STRING} ^&?c=(l?v?i?&d=|v&fnot=|setup&ref=|l&r=|d&d=|tree&d|t&d=|e&d=|i&d=|codes|md5crack).*$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)([-_a-z]{1,15})=(chmod|chdir|mkdir|rmdir|clear|whoami|uname|unzip|gzip|gunzip|grep|more|umask|telnet|ssh|ftp|head|tail|which|mkmode|touch|logname|edit_file|search_text|find_text|php_eval|download_file|ftp_file_down|ftp_file_up|ftp_brute|mail_file|mysql|mysql_dump|db_query)([^a-zA-Z0-9].+)*$ [OR]
# Удалите из следующей строки слово "system" для нормальной работы информационных систем HostCMS
RewriteCond %{QUERY_STRING} ^(.*)(wget|shell_exec|passthru|system|exec|popen|proc_open)(.*)$
RewriteRule .* - [F]
# Отклонение плохо сформированных запросов HTTP. У меня вызывают ошибку
#RewriteCond %{THE_REQUEST} !^[A-Z]{3,9} .+ HTTP/(0.9|1.0|1.1|2.0) [NC]
#RewriteRule .* - [F,NS,L]
# Запрет любых запросов кроме GET,PROPFIND,POST,OPTIONS,PUT,HEAD
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST|PROPFIND|OPTIONS|PUT)$ [NC]
RewriteRule .* - [F,NS,L]
# Блокировка от LFi-атак (экспериментальное)
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=https:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=https%3A%2F%2F [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(..//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC]
RewriteRule .* - [F]

Как не навредить сайту при работе с .htaccess

  • Помните о бэкапах – перед изменением .htaccess следует делать его копию.
  • Чтобы не запутаться, в дочерних файлах лучше указывать лишь новые директивы. Все остальные будут наследоваться от родительского каталога, находящегося в корне.
  • Избавляйтесь от мусора – при тестировании директив очищайте данные и кэш браузера.
  • Никакой кириллицы – URL на кириллице необходимо переводить в Punycode (кириллические домены используются так, как они указаны в whois).