Сейчас для организации работы подавляющего большинства сайтов в сети используется веб-сервер Apache. Он немного отстает в производительности, но зато очень прост в настройке и имеет огромное количество возможностей.
Веб-сервер Apache можно настраивать не только в главном конфигурационном файле, но и через файлы .htaccess. Эти файлы размещаются в определенных папках и указывают веб-серверу как нужно себя вести в этой папке и ее подкаталогах.
Настройка файла htaccess очень похожа на настройку главного файла конфигурации Apache. Но она немного отличается. С помощью этого файла вы можете настроить редиректы, внутреннее изменение url, права доступа, авторизацию по паролю и многое другое. В сегодняшней статье мы рассмотрим как правильно настроить htaccess для вашего сервера.
Содержание статьи
- Синтаксис файла htaccess
- Настройка доступа htaccess
- Модификация URL в htaccess
- Настройка редиректов в htaccess
- Настройка страниц ошибок в htaccess
- Кэширование в htaccess
- Сжатие файлов в htaccess
- Выводы
Синтаксис файла htaccess
Мы уже начали тему настройки Apache в одной из предыдущих статей, но сегодня немного освежим информацию и рассмотрим более детально именно настройку htaccess.
Все директивы из файла htaccess выполняются точно так же, как если бы они были размещены в глобальном конфигурационном файле, только внутри директивы <Directory адрес_папки_htaccess>. Это не позволяет менять глобальные настройки, но вы можете очень тонко настроить поведение программы в папках, к которым у вас есть права доступа.
Общий синтаксис директив очень прост, это пары команд и их опций, разделенных пробелом, например:
Команда параметр1 параметр2 флаги
Самих команд достаточно много и мы будем рассматривать их на примерах действий, которые они выполняют. Кроме самих команд, тут могут использоваться вложенные структуры, например, для активации модулей или проверки доступности того или иного модуля. А теперь давайте перейдем ближе к тому как выполняется правильная настройка htaccess. Начнем с самых простых действий.
Настройка доступа htaccess
Довольно часто htaccess используется для управления доступом к папке. Для управления доступом используются три команды:
- order - порядок;
- deny - запретить;
- allow - разрешить.
Сначала, с помощью опции order, нужно указать в каком порядке будут выполняться директивы, значение имеет только эта команда, и неважно в какой последовательности они расположены в файле.
Затем с помощью директивы allow или deny мы разрешаем или запрещаем доступ к папке с определенных адресов. Например, чтобы запретить все необходимо добавить в htaccess:
Но мы также можем разрешить доступ только с локальной сети:
Если указано deny,allow, то проверка будет выполняться в таком порядке. Сначала все директивы deny, затем все директивы allow, и если ни одно из условий не подошло, то запрос пропускается.При allow,deny такой запрос будет по умолчанию отклонен. Например, предыдущий пример можно написать так:
Модификация URL в htaccess
Наиболее часто htaccess используется для модификации URL во время выполнения или редиректов. За эту функциональность отвечает модуль mod_rewrite и обычно он активирован в большинстве конфигураций Apache.
Модификация URL в htacces выполняется с помощью трех директив, это RewriteBase, которая указывает префикс адреса, RewriteCond проверяет соответствие, и RewriteRule - изменяет URL в соответствии с регулярным выражением если все правила соответствия подходят.
Сначала нужно включить Mod_Rewrite, на случай если модуль еще не активен:
Укажем, что в качестве префикса для URL нужно использовать корень:
И будем автоматически заменять URL адреса с index.html на index.php, обратите внимание, что исходный URL - это путь к запрашиваемому файлу относительно расположения файла htaccess:
Для более эффективной замены можно использовать регулярные выражения они состоят из специальных символов и переменных и обычных символов и цифр. Рассмотрим основные специальные символы:
- ^ - начало строки;
- $ - конец строки;
- . - любой символ;
- * - любое количество любых символов;
- ? - один определенный символ;
- [0-9] - последовательность символов, например, от 0 до 9;
- | - символ или, выбирается или одна группа, или другая;
- () - иcпользуется для выбора групп символов.
В регулярных выражениях htaccess также можно использовать переменные с данными, полученными из заголовков запроса, например:
- %{HTTP_USER_AGENT} - поле User-Agent, которое передает браузер пользователя;
- %{REMOTE_ADDR} - IP адрес пользователя;
- %{REQUEST_URI} - запрашиваемый URI;
- %{QUERY_STRING} - параметры запроса после знака ?.
Это наиболее часто используемые переменные, но их есть намного больше, остальные вы можете найти в официальной документации. Регулярные выражения открывают более широкие возможности, например, вы можете заменять во всех страницах html на php:
Директива RewriteCond дает еще больше гибкости, вы можете выбрать к каким адресам стоит применять модификацию, например, будем переопределять данные только для версии с www:
Таким образом, вы можете выполнять любые преобразования ваших URL без фактических редиректов куда-либо. Но дальше мы рассмотрим как делать редиректы.
Настройка редиректов в htaccess
Настройка редиректов htaccess выполняется похожим образом, с помощью того же самого модуля mod_rewrite, только теперь вместо модификации url мы указываем флаг с нужным действием и кодом редиректа.
Самый простой редирект можно выполнить без mod_rewrite, с помощью такой строки:
Но обычно нужны перенаправления с более широким действием. Все выглядит очень похоже, только теперь мы используем флаг [NC] чтобы не учитывать регистр, [L] для прекращения обработки и [R] - для редиректа. Например, перенаправление htaccess с версии без www на домен с www:
Значение R=301 означает код редиректа, который будет возвращен клиенту, можно использовать 301, 302 и т д. Редирект htaccess с домена www на домен без префикса будет выглядеть так:
Таким же образом можно сделать переадресацию:
Редирект с http версии на https:
Настройка страниц ошибок в htaccess
При возникновении каких-либо ошибок во время генерации страницы, веб-сервер выдает краткое сообщение и код ошибки. Но пользователям будет намного понятнее в чем дело, если вы сделаете для каждой ошибки отдельную страницу с картинками и полноценным объяснением.
Настройка htaccess для этого пункта будет очень полезной. Вы можете использовать директиву ErrorDocument. С помощью нее можно задать html страницы для ошибок 4хх и 5хх. Например, для 404:
Кэширование в htaccess
Браузер позволяет хранить в своем кэше изображения, файлы скриптов, стилей и другие медиафайлы определенное время. Время жизни кэша задается веб-сервером с помощью специальных заголовков. Их можно настроить с помощью модуля expires.
Сначала активируем модуль и устанавливаем период кэширования по умолчанию:
Теперь мы можем настроить кэширование для каждого mime типа файлов:
В первой строке мы указываем, что страницы html нужно считать годными на один месяц 15 дней и два часа с момента загрузки. Доступны такие типы файлов:
- image/x-icon;
- image/jpeg;
- image/png;
- image/gif;
- application/x-shockwave-flash;
- text/css;
- text/javascript;
- application/javascript;
- application/x-javascript;
- text/html;
- application/xhtml+xml;
Чтобы быть уверенным что эта конструкция не вызовет ошибок заключите ее в if:
Сжатие файлов в htaccess
Для сжатия в Apache можно использовать модуль deflate. Здесь достаточно просто перечислить mime типы файлов, которые нужно сжать. Например:
Вы также можете заключить конструкцию if, чтобы проверить поддерживается ли этот модуль:
Выводы
В этой статье мы рассмотрели как выполняется настройка файла htaccess для правильной работы вашего сайта. Все действия выполняются не так уже и сложно. Достаточно скопировать несколько строк и исправить их под свои нужды. Если у вас остались вопросы, спрашивайте в комментариях!
На завершение предлагаю видео с обзором конфигурационного файла Apache:
Познавательная статья!
Спасибо большое за проделанную работу и предоставленную помощь новичкам!
Очень помогла статья!
Добрый день. Подскажите пожалуйста как сделать редирект на сайт: https://www.site.ru c 1) http://site.ru 2) http://www.site.ru 3) https://site.ru ?
У вас в статье походу ошибка
"
RewriteBase /;
RewriteCond % {REMOTE_HOST} ^www.site.ru$
RewriteRule ^(.*)\.html$ $1.php
"
вместо REMOTE_HOST должно стоять HTTP_HOST
поправьте меня, если я ошибаюсь, и желательно с объяснениями
Не ошибаетесь, исправил.
Сделайте статью как работать с CORS очень важная тема для меня, front на одном сервере а backend api на другом сервере
Зачем так мучаться? я себе вот тут https://c-wd.ru/tools/htaccess/ за одну минуту сгенирировал .htaccess
Подскажите, как сделать, чтобы файл .htaccess не менялся автоматически сервером. У меня периодически в этой файл добавляются строчки:
# php -- BEGIN cPanel-generated handler, do not edit
# Сделайте пакет «ea-php54» языком программирования «PHP» по умолчанию.
AddHandler application/x-httpd-ea-php54 .php .php5 .phtml
# php -- END cPanel-generated handler, do not edit
Из-за этого сайт перестает работать (белый экран и все), т.к. скрипт написан на php 5.2.
Приходится периодически удалять эти строки когда они добавляются.
Фёдор, необходимо размещать ваши параметры после
# php -- END cPanel-generated handler, do not edit
или до
# php -- BEGIN cPanel-generated handler, do not edit
Внутри данных строк хостинг будет редактировать параметры по своему желанию.
Ну или просто смените хостинг
Добрый день.
Подскажите, пожалуйста, как создать редирект с сайта
https://site.ru/moscow на сайт https://moscow.site.ru
Очень полезная статья, наконец-то смог настроить сжатие файлов