Использование в файле htaccess инструкций не разрешенных в конфигурации сервера приводит к возникновению

Обновлено: 03.07.2024

Автор - Голышев С.В.

В этой статье обсуждается — что такое .htaccess, зачем он нужен, и как его можно использовать.

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

Файл .htaccess может быть размещен в любом каталоге. Директивы этого файла действует на все файлы в текущем каталоге и во всех его подкаталогах (если эти директивы не переопределены директивами нижележащих файлов .htaccess).

Директива AllowOverride может включать в себя одну из следующих директив или их комбинацию: All, None, AuthConfig, FileInfo, Indexes, Limit, Options .

Примечание

Синтаксис .htaccess

Перед тем, как будут рассмотрены примеры, остановимся на синтаксисе директив в файлах .htaccess.

  • Пути к файлам и директориям должны указываться от корня сервера, например, /pub/home/server1/html/

Если вы не знаете путь от корня сервера, то Вы можете его узнать, спросив у администратора сервера, либо можете посмотреть сами, запустив на сайте функцию PHP — phpinfo(). Она выведет на экран конфигурацию PHP в виде фиолетовых таблиц. В них Вам необходимо найти переменную doc_root и посмотреть ее значение — это будет путь от корня сервера до Вашей основной директории.

  • В именах доменов обязательно должны быть указаны протоколы, например:

Примеры использования .htaccess

Глобальное перенаправление (редирект) на другой адрес:

Перенаправление (редирект) только при запросе определенных страниц:

При запросе страниц из каталогов company и forum будет произведено перенаправление на новые адреса.

Перенаправление (редирект) только посетителей с определенным IP-адресом:

SetEnvIf REMOTE_ADDR 192.145.121.1 REDIR="redir"
RewriteCond % redir
RewriteRule ^/$ /only_for_you.html

Если посетитель имеет IP-адрес 192.145.121.1, то ему будет открыта страница only_for_you.html.

Изменение названия индексной страницы:

DirectoryIndex index.html index.php index.shtml

Можно указать несколько индексных страниц. При запросе каталога они будут искаться в том порядке, в котором перечислены в директиве DirectoryIndex. Если не будет найден файл index.html, то будет произведен поиск файла index.php и т.д.

Выполнять код PHP в файлах HTML

Добавив эти строки в .htaccess вы дадите директиву серверу выполнять инструкции PHP не только в файлах с расширением *.php и *.phtml, но и в файлах с расширением *.htm и *.html.

Обработка ошибок Apache

ErrorDocument 401 /401.html
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html

При возникновении этих ошибок посетитель будет перенаправлен на специально созданные страницы.

Telegram каналы и чаты для web разработчика

  • 17 ноября 2017
    Пример реализации консольного скрипта с подключением ядра 1С-БитриксДавно известно, что ряд операций выносят в отдельные php файлы и запускают из консоли, так как это зачастую удобнее, быстрее, да и в принципе на эти операции не нужен браузер.
  • 24 июля 2017
    MySQL ошибка: InnoDB Error Fetch of persistent statistics requested for tableПри разработке одного проекта, часто стали вылетать ошибки базы или просто бесконечная загрузка страницы. После попыток запустить сайт и перезапуска локального сервера - результат ноль.
  • 19 июля 2017
    Битрикс отправка писем с вложениями без танцев с бубномОтправка писем с аттачем в bitrix довольно распространенная задача, например, отсылать пользователям договора, анкеты, выписки и другие файлы. В интернете довольно много различных способов решения задачи.
  • 13 июня 2018 в 17:08
    Galinaced FrancisbaxVX : По моему мнению Вы пошли ошибочным путём.
  • 31 мая 2018 в 15:03
    Igorpi IgorpiNP : Номер не пройдет!
  • 31 мая 2018 в 12:58
    Galinaced FrancisbaxVX : Я извиняюсь, но, по-моему, Вы допускаете ошибку. Пишите мне в PM.
  • 31 мая 2018 в 08:32
    Alexeyced AlexeycedYO : Какие слова. фантастика

О проекте

Проект BX Cert - портал web разработчиков. Данный ресурс будет полезен как новичкам в разработке, так и более опытным web разработчикам.

По всем вопросам Вы можете писать на почту:

Актуальные вакансии

Мы собираем и храним информацию по всем вакансия web разработчиков и программистов PHP, Python и многих других специалистов.

Компании FunBox требуется Фронтенд-разработчик (JavaScript) в Москве
20 ноября 2021

Компании МедиаНация требуется Fullstack-js разработчик в Москве
20 ноября 2021

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

На хостинге RU-CENTER в настоящее время используется веб-сервер Apache версии 2.4.

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

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

Примеры использования файла .htaccess

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

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

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

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

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

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

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

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

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

User-agent: *
Disallow: /errors

/ваш_домен/docs/errors/.htaccess, в котором прописать

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3. Диагностика ошибок

Если после редактирования или размещения .htaccess при обращении к сайту вы получили ошибку 500, то, скорее всего, в файле .htaccess допущена ошибка. Посмотреть её причины вы можете в лог-файле /var/log/ваш_домен.error_log.

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

“Дай человеку рыбу, и он съест ее за один день. Научи человека ловить рыбу и он будет есть ее на протяжении всей жизни.” - Конфуций

В данной статье мы попытаемся не только показать Вам примеры полезных .htaccess директив, но и ответить на вопрос "Как эти файлы работают?". Внимание будет уделяться Apache 2, однако большая часть может быть применена к Apache 1.3, и мы попытаемся указать на их различия.

Что такое .htaccess?

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

Директивы

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

Включение поддержки .htaccess

Обычно, использование .htaccess включено по умолчанию. Отношения между глобальным файлом доступа и пользовательскими файлами .htaccess контролируется директивой AllowOverride в файле httpd.conf. Она может быть размещена только внутри блока <Directory>. Значением по умолчанию является конечно "All". Таким образом использование .htaccess файлов включено по умолчанию. Альтернативным значением может быть "None", это значит что они полностью выключены. Есть множество других значений, которые ограничивают конфигурацию только определенным контекстом. Например, такие как:

  • AuthConfig - Разрешает использование директив разрешения, необходимых для защиты каталогов паролями, т.е. разрешает установку авторизации по имени пользователя и паролю (базовая аутентификация ).
  • FileInfo - Разрешает использование директив, управляющих типами документа (Headers, Error Documents, Cookies, URL Rewriting и т.д.).
  • Indexes - Показывать посетителю список файлов, если в выбранном каталоге нет файла index.html или его аналога
  • Limit - Допускает использование основных директив управления доступом (allow, deny и order), директив сакционирования Limit, т.е., например, ограничивает доступ к файлам в зависимости от адреса клиентского компьютера.
  • Options - Позволяет управлять тем, какие функции сервера доступны для использования в каталоге, указанном в секции <Directory>. Может принимать значения ExecCGI, FollowSymLinks, MultiViews, Includes и другие.

Полное использование .htaccess

Я покажу несколько примеров без надлежащего блока <Directory>. В этом примере включается возможность использования .htaccess в полном объеме:

Ограниченное использование .htaccess

А в данном примере, включаем только аутентификацию и индексы :

AllowOverride AuthConfig Indexes

Комментарии

Вторая строчка сама директива AllowOverride. Это обычный синтаксис директив Apache. За директивой следуют пробелы, разделяющие список значений. Конечно, такой синтаксис смотрится довольно свободным. Всегда будьте осторожны .

Иногда, даже одна ошибка в файлах httpd.conf или .htaccess может привести к временной неработоспособности сервера, и пользователи будут видеть ошибку "500 - Internal Server Error pages".

Если Вы сомневаетесь в синтаксисе директив, то смотрите их на Apache Directive, где каждая директива включает пункт "Syntax". Я могу сделать эту статью интереснее, но всегда самой лучшей документацией является документация официальная.

Проверка включена ли поддержка .htaccess

Вполне возможно, что Ваша хостинг-компания не даст Вам доступ к httpd.conf файлу. Поэтому как Вы узнаете, включена ли поддержка .htaccess или нет? Не беспокойтесь. .htaccess это такая полезная функция, что большинство компаний включают ее, ну или включат по Вашей просьбе. Если в конфигурации Вашего хостинга не указана поддержка .htaccess, то обратитесь в технический отдел с письмом "проверить поддержку". Скорее всего у них уже подготовлен ответ на Ваш вопрос!

В любом случае, Вы всегда можете проверить работу простого .htaccess файла. Далее мы рассмотрим два способа проверки поддержки .htaccess.

Способ 1

Этот тест очень прост. Мы используем директивы, чтобы заставить Apache искать "index good.html" до "index.html". Если поддержка .htaccess включена, то при заходе в папку через браузер, Apache загрузит .htaccess и узнает, что он должен показать страницу "indexgood.html" с поздравлением! Если поддержка выключена, то Apache проигнорирует .htaccess, и немедленно начнет искать файл "index.html" по умолчанию.

DirectoryIndex

Good, Apache Redirected

Bad, htaccess Ignored

Способ 2

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

Здесь "AHHHHHHH” не является директивой Apache. Это приведет к ошибке, если Apache попытается прочитать такой .htaccess файл! Поэтому, если Вы получите в ответ страницу с "Internal Server Error", говорящую о том, что сервер искал Ваш .htaccess файл, значит поддержка включена! А если Вы увидите index.html, то поддержка .htaccess отключена. Оба случая приведены ниже:

Good, Internal Service Error

Bad, htaccess Ignored

AccessFileName

Последствия использования .htaccess файлов:

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

Это говорит вот о чем. Во первых, Apache ищет .htaccess файлы при каждом запросе, любые изменения будут немедленно применены. Apache не кэширует их, и Вы сможете проверить изменения при следующем запросе. Тем не менее, это значит, что Apache выполняет некоторые дополнительные действия для каждого запроса. Например, если пользователь запрашивает /www/supercool/test/index.html, то сервер проверит существование следующих .htaccess файлов:

  1. /www/.htaccess
  2. /www/supercool/.htaccess
  3. /www/supercool/test/.htaccess

Листинг директории - Indexes:

Отображение содержимого каталога

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

Когда посетитель запрашивает ссылку на каталог (например, http://htaccess.net.ru/doc/), и такой каталог существует, Apache сперва ищет файл по умолчанию. Обычно он называется "index.html" или "index.php". Если он не находит таких файлов, то он возвращается к модулю mod_autoindex, чтобы вывести список файлов и директорий в запрашиваемой директории. Иногда это функция включена иногда нет. Точно, с помощью .htaccess Вы можете легко манипулировать листингом!

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

Директива Options

Эта директива может принимать несколько значений. Если Вы снабжаете параметры символами "+" или "-", как мы делали с -Indexes, то эта опция будет наследована директориями выше и основной конфигурацией! Если Вы не указываете эти символы, то будет доступно только для данной директории и ее поддиректорий.

С такой директивой в Вашем .htaccess файле, Вы не увидите списка файлов. Посмотрим, что было до и после установки директивы:

Before, Normal Directory Listing

After, Forbidden Access

Базовая аутентификация (Basic Authentication)

Возможно, отключение листинга директорий это не то, что Вы хотите сделать. Наверно Вы хотите оставить листинг, но пускать на страницы только определенных пользователей сайта. Базовая аутентификация (Basic Authentication) может быть полезной в таком случае. Это основной тип аутентификации в интернете. Когда посетитель пытается получить доступ к странице, он видит диалоговое окно Пользователь/Пароль. Только нужные пользователи смогут получить доступ.

Для базовой аутентификации необходимы два шага:

  1. Создать файл, в котором будут храниться имя пользователя и пароль(шифрованные).
  2. Добавить в .htaccess несколько строчек для использования файла с паролями.

Обычно, файл с паролями разработчики называют ".htpasswd". Это так, потому что команда, которая генерирует шифрованную пару пользователь/пароль, называется htpasswd. Если Вы владеете этой командой, то Вам не составит труда создать новую пару. В противном случае можете воспользоваться онлайн сервисом, который просто выдаст сгенерированный текст в окно браузера.

Давайте создадим простой .htpasswd файл для пользователя "joe" с паролем "cool". Вставим эти данные в онлайн сервис и получим:

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

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

Если Вы все сделали правильно, то увидите диалоговое окно аутентификации:

Login Dialog

Заголовки (Headers)

С каждым запросом (от браузера) и каждым ответом (от веб сервера типа Apache) приходят две секции. Секция с заголовками и секция с самими данными, если нет больше других.

Заголовки запроса приходят от клиента к серверу. Заголовки ответа наоборот. Они генерируются самим сервером (Apache): кодировка(the content encoding), размер, mime/type, управление кэшем (Cache Control), перенаправления (Redirects), статус (Status Codes) и другие. Когда-нибудь получали ошибку 404? Это результат запроса к несуществующему файлу. Сервер возвращает код 404 (Status Code) в своем ответе.

А что можно сделать в .htaccess? Вы можете использовать директивы Apache, чтобы переписать (изменить) или добавить новые заголовки, которые будут отправлены клиенту в ответе.

Начнем с примера. Добавим заголовок в ответ и посмотрим что получится:

Запрос к файлу в той же директории, что и .htaccess файл, покажет наш заголовок:

Custom Header Shown in Safari

Заметили у заголовка префикс "X-". Так разработчики обычно помечают их, чтобы указать, что они не стандартные. Эта договоренность описана здесь.

Иногда разработчики указывают смешные заголовки (This site).

Однако, я хочу показать Вам, как создавать заголовки, которые Вы сможете использовать для отладки. Как то раз, я использовал их для проверки подключения модулей на сервере. Я сделал следующую проверку:

Когда я сделал запрос с браузера, я увидел заголовки, это означало, что модули подключены!

Есть различия между Header set и Header add. С помощью "add", заголовки всегда добавятся в ответ. Даже, если они встречаются несколько раз в ответе. Вы можете использовать "set", для того, чтобы переписать заголовок по умолчанию. Например, переопределить mime/type заданный заголовком Content-Type. И тогда не будет дубликатов!

Заключение:

Я не описал несколько базовых директив Apache. Моей задачей было дать фундаментальные знания.

Читайте также: