База знаний

Инструкции и ответы на вопросы о хостинге, работе сайтов и приложений

Инструкции файла .htaccess

Файл .htaccess позволяет изменять некоторые настройки веб-сервера Apache (например, перенаправление) и опции PHP для сайта, поддомена или вложенной директории без изменения конфигурационного файла Apache или php.ini. Директивы, указанные в файле .htaccess, распространяются на саму директорию, в которой находится .htaccess, и на все вложенные, в том числе и на поддомены.

Как правило, файл .htaccess создается в  корневой директории сайта или в тех, которые требуют специфического поведения веб-сервера (запрет отображения списка файлов, обработка статических файлов, авторизация и прочее). Если файл .htaccess отсутствует в корне сайта, создайте его через Файловый менеджер Панели управления или загрузите с локального компьютера при помощи FTP-клиента.

При редактировании файла .htaccess будьте предельно внимательны: неверно указанные директивы и посторонние символы могут привести к внутренней ошибке сервера (500 Internal Server Error).

Настройки веб-сервера Apache

Перенаправление

Простое правило перенаправления задается директивой Redirect, в которой содержится код ответа, источник перенаправления и целевая страница. Чтобы перенаправить запрос посетителя с главной страницы вашего сайта на другой домен, добавьте в файл .htaccess сайта директиву:

Redirect 301 / http://example.com/

В случае, если перенаправление носит временный характер, перенаправить запрос со страницы blog на другую страницу того же сайта new-blog можно вот так:

Redirect 302 /blog /new-blog/index.php

Простые правила перенаправления вы можете создавать автоматически при помощи раздела «Перенаправления» в Панели управления хостингом при переходе к управлению сайтом. Более сложные правила (с условиями и дополнительными параметрами) составляются при помощи модуля Apache mod_rewrite. Использование этого модуля позволяет решить широкий спектр задач, примеры некоторых мы рассмотрим ниже.

Перенаправление на HTTPS

Защита SSL-сертификатом обязывает сайт всегда работать только по протоколу HTTPS. Данное правило перенаправляет запросы, поступившие от посетителей сайта, с HTTP на HTTPS:

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

Поместите это правило как можно выше в файле .htaccess, чтобы другие правила перенаправления не помешали ему. Руководство по правильному переводу сайта на работу по протоколу HTTPS вы можете найти в статье.

Перенаправление на определенное имя сайта (с или без www)

Если у вашего сайта несколько имен, но вы хотите, чтобы пользователи всегда видели в адресной строке определенное имя сайта (в данном примере это www), добавьте в файл .htaccess в корне вашего сайта следующие строки:

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

Во второй строке правила содержится условие: все запросы, которые поступили не на имя www.example.com, перенаправлять на www.example.com. Чтобы конкретизировать правило (например, задать определенный домен, а не все, что подходят под условие), достаточно убрать восклицательный знак — он означает отрицание. Например, данное правило перенаправляет запросы с дополнительного домена alias.com на основной сайт site.ru:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^alias.com$
RewriteRule ^(.*) http://site.ru/$1 [R=301,L] 

Избавиться от дублей страниц

Поисковые системы при индексации сайта могут воспринимать ссылки со слешем (косая черта — /) и без него как разные страницы. А еще бывает, что при обращении к таким ссылкам открывается разное содержимое (например, example.com/shop/ — работает, а example.com/shop — отдает код 404). Чтобы устранить эти дубли страниц, примените к сайту эти правила перенаправления 301.

Добавить слеш ко всем страницам сайта можно при помощи правила:

RewriteEngine on
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.
RewriteRule ^(.*) %{REQUEST_URI}/ [R=301,L]

Это правило автоматически перенаправит поискового робота и посетителя, например, со страницы example.com/shop на example.com/shop/.

Чтобы наоборот убрать слеш в конце ссылок на страницы сайта, внесите в файл .htaccess следующие директивы:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]

В эти правила можно добавить исключение для конкретной директории, чтобы на нее правило перенаправления не действовало — например, если это обусловлено особенностями CMS сайта:

RewriteCond %{REQUEST_URI} !admin/$

Добавьте эту строку в середину правила (под остальными RewriteCond) и измените имя директории из примера.

Сделать собственную страницу с ошибкой (ErrorDocument)

Посетители могут перейти по несуществующим ссылкам на вашем сайте и увидеть сформированное браузером сообщение: «HTTP 404 Not Found: The requested URL /123 was not found on this server». Вы можете создать свою собственную страницу такой ошибки. Для этого добавьте инструкцию в файл .htaccess:

ErrorDocument 404 /error404.html

Страницу ошибки error404.html поместите в ту папку, где находится сам .htaccess или укажите в директиве путь к файлу во вложенной папке. Собственные страницы ошибок можно создать и для ряда других ответов сервера: 500 (ошибка в скрипте), 403 (доступ запрещен), 401 (не авторизован) и т.д.

Закрыть сайт от посетителей

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

Запретить доступ по IP-адресу

Простая директива, в которой указываются списки IP-адресов доступа и запрет для остальных, выглядит так:

<RequireAll>
    Require ip X.X.X.X
</RequireAll> 

Вместо X.X.X.X укажите ваш IP-адрес (проверить его можно, например, здесь). Обращения с других IP-адресов завершатся ошибкой 403 Forbidden.

Чтобы запретить доступ к сайту только с определённого IP-адреса, нужно добавить not. Само правило будет выглядеть так:

<RequireAll>
    Require all granted
    Require not ip X.X.X.X
</RequireAll>

Если ваш интернет-провайдер выдаёт IP-адрес из какого-то диапазона, и его последние цифры могут меняться, IP-адрес можно указать не полностью или сразу с подсетью или все эти варианты сразу, через пробел:

<RequireAll>
    Require ip X1.X1.X1.X1 X2.X2 X3.X3.X3.X3/24
</RequireAll>

Аналогичным вариантом будет:

order deny,allow
deny from all
allow from X.X.X.X 

Однако, этот вариант уже признан устаревшим, хоть ещё иногда встречается.

Запретить доступ по User-Agent

Этот метод обычно требуется в случае, если доступ к сайту нужно запретить для роботов или программ, имеющих динамические IP-адреса. Подробно о User-Agent мы рассказали в статье нашего блога

Для блокировки достаточно в начало файла .htaccess добавить директивы:

SetEnvIfNoCase User-Agent example1 bad_bot
SetEnvIfNoCase User-Agent example2 bad_bot
<RequireAll>
    Require all granted
    Require not env bad_bot
</RequireAll> 

Вместо example1 и example2 укажите User-agent роботов или программ, доступ для которых требуется запретить.

Этот вариант самый предпочтительный, поскольку в bad_bot можно добавить сколько угодно User-Agent и заблокировать их одним небольшим правилом

Альтернативным вариантом будет:

<RequireAll>
    Require all granted
    Require expr %{HTTP_USER_AGENT} !~ /(?i:example1|example2)/
</RequireAll> 

Правило ?i: делает регулярное выражение нечувствительным к регистру.

Такой вариант подойдёт, если нужно сделать особое правило блокировки на основе регулярных выражений. 

Помимо %{HTTP_USER_AGENT} можно использовать и другие стандартные переменные сервера. Список других переменных и примеров регулярных выражений есть в официальной документации Apache.

Ещё один альтернативный вариант блокировки роботов:

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} “(example1|example2)” [NC]
RewriteRule .* - [F]

Этот вариант в свою очередь является одним из самых распространённых и тоже позволяет использовать регулярные выражения. Другие примеры можно найти в официальной документации Apache.

Направить на страницу о технических работах

Также можно перенаправлять посетителей на собственноручно созданную страницу с сообщением о проводимых технических работах. С указанного в условии (RewriteCond) IP-адреса сайт будет отображаться по-прежнему:

RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^X.X.X.X$
RewriteCond %{REQUEST_URI} !^site-closed.html
RewriteRule ^.*$ site-closed.html

Страницу ошибки site-closed.html необходимо поместить в корневом каталоге сайта или указать в директиве путь к ней.

Поддомен открывается с ошибкой Internal Server Error (частный случай)

Для поддомена наследуются настройки .htaccess домена. Если в настройках .htaccess домена используются правила mod_rewrite, они могут приводить к некорректной работе поддомена. Добавьте в начало файла .htaccess поддомена следующую директиву:

RewriteEngine off

Это правило отключит mod_rewrite для вложенной директории поддомена.

Установка индексного файла (DirectoryIndex)

При открытии директории без указания конкретного файла веб-сервер ищет индексные файлы index.html, index.php в порядке приоритета для отображения. Если индексные файлы отсутствуют, сервер возвращает ошибку 403 Forbidden, так как отображение списка файлов (листинг директорий) по умолчанию запрещено.

Чтобы установить в качестве индексного файла произвольный файл, следует добавить инструкцию:

DirectoryIndex имя_файла

Например, следующая инструкция предписывает веб-серверу при обращении к сайту открывать не страницу, а изображение example.jpg в папке pics сайта:

DirectoryIndex /pics/example.jpg

Настройки веб-серверов в Панели управления

В настройках базового веб-сервера вы можете изменять все директивы PHP, значение графы Changeable для которых соответствует PHP_INI_PERDIR или PHP_INI_ALL. Эти настройки будут иметь силу на всех сайтах, которые работают на этом веб-сервере.

Управлять абсолютно всеми параметрами PHP вы можете на расширенном веб-сервере, редактируя php.ini через его настройки.

Чтобы установить индивидуальные параметры PHP для отдельного сайта, используйте файл .htaccess. Через него можно управлять всеми параметрами, доступными для изменения на базовом веб-сервере – примеры самых востребованных перечислены ниже.

Отображать ошибки PHP (display_errors)

По умолчанию отображение ошибок PHP на хостинге отключено. Для того чтобы видеть текст ошибок PHP на странице сайта, добавьте в файл .htaccess директиву:

php_value display_errors 1

Включить журнал ошибок PHP (error_log)

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

php_value error_log /home/login/domains/example.com/php_errors.log

Директория в пути расположения файла должна существовать, а если ее нет — обязательно создайте папку вручную. Файл журнала будет создан при появлении первой ошибки.

Увеличить оперативную память для скриптов (memory_limit)

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

php_value memory_limit 512M

Вместо 512M укажите желаемый размер ограничения. Обратите внимание, что символ "M" (латинская M) указывается слитно со значением. Уточнить максимальное значение оперативной памяти, доступное по тарифу, можно в документе.

Увеличить время выполнения скриптов (max_execution_time)

Чтобы увеличить время выполнения скриптов (в секундах), добавьте следующую директиву в .htaccess:

php_value max_execution_time 300

Вместо 300 укажите желаемый размер ограничения. Обратите внимание, что выполнение скрипта более чем в 10 минут (600 секунд) завершится ошибкой с кодом 504.

Изменить объем загружаемого файла (post_max_size и upload_max_filesize)

По умолчанию через сайт можно загрузить файл объемом не более 1Гб. Чаще этот размер даже меньше — 100Мб, из-за ограничения на объем запроса методом POST.

Если вам нужно загружать файлы бóльшего размера, либо же ограничить их объем (чтобы контролировать дисковую квоту), то управлять объемом загружаемого файла можно через .htaccess:

php_value post_max_size 200M
php_value upload_max_filesize 200M

Вместо 200M укажите желаемый размер ограничения. Обратите внимание, что символ "M" (заглавная латинская M) указывается слитно со значением.

Передавать максимум переменных в PHP (max_input_vars)

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

php_value max_input_vars 15000

Вместо 15000 укажите необходимый размер ограничения, который требует CMS сайта.

Исправить неверную кодировку (default_charset)

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

AddDefaultCharset "windows-1251"
php_value default_charset "windows-1251"

Вместо "windows-1251" подставьте подходящую кодировку, например, UTF-8. Проверить, в какой именно кодировке написан сайт, можно через инструменты используемого браузера. Если сайт не обрел корректный вид, обратитесь за помощью в службу технической поддержки.

Обрабатывать интерпретатором PHP не только файлы .php (AddType)

Чтобы заставить интерпретатор PHP обрабатывать файлы с произвольным расширением, (например, .phtml), добавьте в файл .htaccess следующую строку:

AddType application/x-httpd-php .phtml

Изменить время хранения сессий PHP

Изменение времени хранения сессий может потребоваться, если вы хотите, чтобы данные об авторизации пользователей на вашем сайте сохранялись дольше.

По умолчанию время хранения сессий — 1440 секунд (24 минуты). Для изменения этого значения добавьте в .htaccess следующие директивы:

php_value session.save_path /home/login/domains/example.ru/tmp
php_value session.gc_maxlifetime 604800
php_value session.cookie_lifetime 604800

Обратите внимание: при большом количестве посетителей и длительном времени сохранения сессий в папке, указанной в session.save_path, образуется большое количество файлов. Это может вызывать замедление сайта в момент очистки старых сессий и увеличивать количество потребляемых ресурсов. Альтернативные механизмы хранения и очистки сессий:

  1. Указывать вложенность директорий хранения сессий с помощью аргумента N в session.save_path и очищать старые сессии собственными скриптами (описание session.save_path в документации PHP).
  2. Реализовать собственный механизм хранения сессий (например, в MySQL) и установить его с помощью функции session_set_save_handler.

Другие настройки (CGI, Python, Node.js)

Включить SSI

Директивы SSI (Server Side Includes) по умолчанию обрабатываются в файлах с расширением .shtml (например, index.shtml). Чтобы SSI обрабатывались и в других файлах, необходимо в файле .htaccess указать типы этих файлов:

AddType text/html .html .ssi
AddOutputFilter INCLUDES .html .ssi

Вместо ".ssi .html" укажите расширения файлов, в которых должны обрабатываться директивы SSI. Использовать в одном и том же файле PHP и SSI одновременно не рекомендуется.

Выполнять скрипты CGI/Perl

Чтобы CGI/Perl-скрипты выполнялись в браузере, необходимо создать файл .htaccess и добавить в него строки:

Options +ExecCGI
AddHandler cgi-script .cgi .pl
SetEnv PERL5LIB /home/login/perl5:/home/login/perl5/lib/perl5:/usr/local/lib/perl5
SetEnv LD_LIBRARY_PATH /home/login/perl5/lib

Вместо ".cgi .pl" укажите список расширений, которые должны обрабатываться веб-сервером. Убедитесь, что у вас есть права на исполнение этих скриптов (например, 755). А в переменных PERL5LIB и LD_LIBRARY_PATH, которые указывают веб-серверу, откуда подгружать модули Perl, вместо login вставьте свой логин.

Включить uWSGI (Python)

Проектам на языке Python необходим файл .htaccess с таким содержанием:

DirectoryIndex site.wsgi
Options +ExecCGI
AddHandler wsgi-script .wsgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /site.wsgi/$1 [QSA,PT,L]

Вместо site.wsgi укажите входной файл вашего приложения.

Включить Node.js c помощью приложения Passenger

Чтобы обрабатывать скрипты Node.js, укажите в .htaccess следующие директивы:

SetEnv GHOST_NODE_VERSION_CHECK false
PassengerStartupFile app.js
PassengerResolveSymlinksInDocumentRoot on
Require all granted
PassengerAppType node
PassengerAppRoot /home/login/domains/example.com/public_html
Options -MultiViews 

Замените example.com на основное имя вашего сайта, а login на логин вашего аккаунта.

У меня остались еще вопросы!

Если вы не нашли ответа на свой вопрос в этом разделе, то вы всегда можете обратиться к нам за помощью через форму обратной связи в разделе «Поддержка» Панели управления.

Была ли эта инструкция полезной?