Лекция
Game: Perform tasks and rest cool.8 people play!
Play gameПривет, Вы узнаете о том , что такое файл настроек apache htaccess, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое файл настроек apache htaccess , настоятельно рекомендую прочитать все из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend) .
Apache - самый распространенный HTTP-сервер. Распространяется бесплатно, включая исходные тексты. Поддерживаются сценарии на CGI (включая FastCGI), PHP, Perl, Java. Аутентификация - базовая, message-digest, TLS (SSL). С апреля 1996 это самый популярный HTTP-сервер в Интернете, в августе 2007 года он работал на 51% всех веб-серверов.
.htaccess — файл дополнительной конфигурации веб-сервера Apache, а также подобных ему серверов. Позволяет задавать большое количество дополнительных параметров и разрешений для работы веб-сервера у отдельных пользователей (а также на различных папках отдельных пользователей), таких как управляемый доступ к каталогам, переназначение типов файлов и т.д., не предоставляя доступа к главному конфигурационному файлу, т.е. не влияя на работу всего сервиса целиком.
.htaccess является подобием httpd.conf с той разницей, что действует только на каталог, в котором располагается, и на его дочерние каталоги. Возможность использования .htaccess присутствует в любом каталоге пользователя.
Файл .htaccess может быть размещен в любом каталоге сайта. Директивы этого файла действуют на все файлы в текущем каталоге и во всех его подкаталогах (если эти директивы не переопределены директивами нижележащих файлов.htaccess).
Это преимущество является одновременно и его недостатком . т к апач ищет во сех папках вызываемых скриптов этот файл, поэтому для ускорения работы сервера иногда отключают возможность и вся конфигурация находится в гравном конфиг файле httpd.conf или в файлее персоональных настроек каждого хоста /ets/apache2/site-enable/*.conf
Директивы .htaccess предоставляют пользователю широкий выбор возможностей по настройке своего сайта, среди которых:
Директивы простого перенаправления (редирект); Директивы сложного перенаправления (mod_rewrite); Индексные страницы; Обработка ошибок; Кодировка; Управление доступом; Паролирование директорий; Опции PHP; |
Список всех доступных директив можно посмотреть тут.
Game: Perform tasks and rest cool.8 people play!
Play game
Redirect / http://www.example.com # http://www.example.com - URL, на который мы перенаправляем запросы |
Более сложный пример - мы хотим определенные страницы нашего сайта переадресовывать на другие сайты:
Redirect /linux http://www.linux.org Redirect /linux/download.html http://www.linux.org/dist/download_info.html Redirect 301 /kernel http://www.linux.org |
Game: Perform tasks and rest cool.8 people play!
Play game
Redirect [status] URL_LOCAL URL_REDIRECT status : необязательное поле, определяет код возврата. Допустимые значения: * permanent (301 — документ перемещен постоянно) * temp (302 — документ перемещен временно) * seeother (303 — смотрите другой) * gone (410 — убран) URL_LOCAL : локальная часть URL запрашиваемого документа. URL_REDIRECT : URL, куда должен быть выполнен редирект. |
Директива RedirectMatch аналогична директиве Redirect за исключением того, что в RedirectMatch возможно использование регулярных выражений, что, несомненно, может быть удобно в некоторых условиях. Например, для организации передачи параметров скрипту в теле URL:
RedirectMatch /(.*)/(.*)/index.html$ http://mysite.ru/script.php?par1=$1&par2=$2 |
Хотя данный пример и вызовет перезагрузку страницы, в дальнейшем его можно будет улучшить. Здесь необходимо сделать небольшое лирическое отступление и поговорить о синтаксисе регулярных выражений.
В регулярном выражении можно использовать любые печатные символы и пробел, но часть символов имеет особое значение:
|
Это все основные примитивы, с помощью которых можно построить любое регулярное выражение.
Game: Perform tasks and rest cool.8 people play!
Play gameGame: Perform tasks and rest cool.8 people play!
Play game
$N |
(0 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteRule (единственной, следующей сразу за текущим набором директив RewriteCond). |
%N |
(1 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteCond в текущем наборе условий. |
%{NAME_OF_VARIABLE} |
где NAME_OF_VARIABLE может быть одной из ниже приведенных переменных |
Ниже приводится список всех доступных переменных %{NAME_OF_VARIABLE} с их кратким описанием.
HTTP_USER_AGENT |
Содержит информацию о типе и версии браузера и операционной системы посетителя. |
HTTP_REFERER |
Приводится адрес страницы, с которой посетитель пришел на данную страницу. |
HTTP_COOKIE |
Список COOKIE, передаваемых браузером. |
HTTP_FORWARDED |
Cодержит IP-адрес прокси-сервера или сервера балансировки нагрузки. |
HTTP_HOST |
Адрес сервера, например, beget.ru . |
HTTP_ACCEPT |
Описываются предпочтения клиента относительно типа документа. |
REMOTE_ADDR |
IP-адрес посетителя. |
REMOTE_HOST . |
Адрес посетителя в нормальной форме — например, rt99.net.ru . |
REMOTE_IDENT |
Имя удаленного пользователя. Имеет формат имя.хост, например, kondr.www.rtt99.net.ru |
REMOTE_USER |
Тоже, что и REMOTE_IDENT, но содержит только имя. Пример: kondr |
REQUEST_METHOD |
Позволяет определить тип запроса (GET или POST). Должен обязательно анализироваться, т.к. определяет дальнейший способ обработки информации. |
SCRIPT_FILENAME |
Полный путь к веб-странице на сервере. |
PATH_INFO |
Содержит в себе все, что передавалось в скрипт. |
QUERY_STRING |
Содержит строчку, переданную в качестве запроса при вызове CGI скрипта. |
AUTH_TYPE |
Используется для идентификации пользователя |
DOCUMENT_ROOT |
Cодержит путь к корневой директории сервера. |
SERVER_ADMIN |
Почтовый адрес владельца сервера, указанный при установке. |
SERVER_NAME |
Адрес сервера, например, kondr.beget.ru |
SERVER_ADDR |
IP-адрес вашего сайта. |
SERVER_PORT |
Порт, на котором работает Apache. |
SERVER_PROTOCOL |
Версия HTTP протокола. |
SERVER_SOFTWARE |
Название сервера, например, Apache/1.3.2 (Unix) |
TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME |
Переменные, предназначеные для работы со временем в разных форматах. |
API_VERSION |
Это версия API модуля Apache (внутренний интерфейс между сервером и модулем) в текущей сборке сервера, что определено в include/ap_mmn.h. |
THE_REQUEST |
Полная строка HTTP-запроса, отправленная браузером серверу (т.е., «GET /index.html HTTP/1.1»). Об этом говорит сайт https://intellect.icu . Она не включает какие-либо дополнительные заголовки отправляемые браузером. |
REQUEST_URI |
Ресурс, запрошенный в строке HTTP-запроса. |
REQUEST_FILENAME |
Полный путь в файловой системе сервера к файлу или скрипту, соответствующему этому запросу. |
IS_SUBREQ |
Будет содержать текст «true», если запрос выполняется в текущий момент как подзапрос, «false» в другом случае. Подзапросы могут быть сгенерированы модулями, которым нужно иметь дело с дополнительными файлами или URI для того, чтобы выполнить собственные задачи. |
Game: Perform tasks and rest cool.8 people play!
Play gameGame: Perform tasks and rest cool.8 people play!
Play game
|
Все эти проверки также могут быть предварены префиксом восклицательный знак ('!') для инвертирования их значения.
RewriteEngine включает или выключает работу механизма преобразования. Если она установлена в положение off, этот модуль совсем не работает. Заметьте, что по умолчанию настройки преобразований не наследуются. Это означает, что вы должны иметь RewriteEngine on директиву для каждого виртуального хоста, в котором вы хотите использовать этот модуль.
Синтаксис RewriteEngine выглядит следующим образом:
RewriteEngine on | off # По умолчанию RewriteEngine off |
Используйте для комбинирования условий в правилах OR вместо AND. Типичный пример - перенаправление запросов на поддомены в отдельные каталоги.
RewriteEngine on RewriteCond %{REMOTE_HOST} ^mysubdomain1.* [OR] RewriteCond %{REMOTE_HOST} ^mysubdomain2.* [OR] RewriteCond %{REMOTE_HOST} ^mysubdomain3.* RewriteRule ^(.*)$ ^mysubdomain_public_html/$1 RewriteCond %{REMOTE_HOST} ^mysubdomain4.* RewriteRule ^(.*)$ ^mysubdomain4_public_html/$1 |
Для выдачи главной страницы какого-либо сайта, согласно «User-Agent:» заголовку запроса, Вы можете использовать следующие директивы:
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* RewriteRule ^/$ /homepage.max.html [L] RewriteCond %{HTTP_USER_AGENT} ^Lynx.* RewriteRule ^/$ /homepage.min.html [L] RewriteRule ^/$ /homepage.std.html [L] |
Для выдачи разных сайтов для разных браузеров, согласно «User-Agent:» заголовку запроса, Вы можете использовать следующие директивы:
Game: Perform tasks and rest cool.8 people play!
Play game
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* RewriteRule ^(.*)$ /mozilla/$1 [L] RewriteCond %{HTTP_USER_AGENT} ^Lynx.* RewriteRule ^(.*)$ /lynx/$1 [L] RewriteRule ^(.*)$ /default/$1 [L] |
Game: Perform tasks and rest cool.8 people play!
Play gameОбщий синтаксис директивы RewriteRule выглядит следующим образом:
RewriteRule Шаблон Подстановка [flag] # flag - необязательное поле указывающее дополнительные опции |
Game: Perform tasks and rest cool.8 people play!
Play gameGame: Perform tasks and rest cool.8 people play!
Play gameКогда пользователь заходит на хост, например, http://gentoo.org, принято, что открывается индексный файл index.* , а при его отсутствии отображается либо содержимое каталога, либо отдается ошибка 403 FORBIDDEN (если отключена опция "просмотр директорий").
За листинг файлов отвечает директива Indexes (показывать посетителю список файлов, если в выбранном каталоге нет файла index.html или его аналога).
Иногда нужно сделать так, чтобы в случае отсутствия в каталоге файла, который показывается по умолчанию, листинг, то есть список файлов в каталоге, не выдавался. В этом случае добавим в .htaccess такую строчку:
# Запрет выдачи листинга пустого каталога Options -Indexes |
А чтобы выдавал листинг, нужно:
Options Indexes |
Если же понадобится разрешить просматривать список файлов, но чтобы при этом чаcть файлов определенного формата не отображалась, то запишем:.
IndexIgnore *.php* *.pl |
Выдает листинг каталога, т.е. его содержание со всем содержанием, за исключением файлов-скриптов PHP и Perl.
Если ваш веб-сайт построен на скриптах, то в качестве индексных часто могут использоваться файлы с другими расширениями. Указать эти файлы можно с помощью директивы DirectoryIndex .
DirectoryIndex index.html index.shtml index.pl index.cgi index.php |
Если же вы хотите что бы при обращении к каталогу открывался не index.html, а, например, файл htaccess.php или /cgi-bin/index.pl:
DirectoryIndex htaccess.php /cgi-bin/index.pl |
Game: Perform tasks and rest cool.8 people play!
Play gameВ ходе работы сервера иногда возникают ошибки, однако правильнее называть их не сбоями в работе сервера, а стандартными кодами возврата, оговоренными в стандарте HTTP_RFC2616. Вообще, в RFC ошибки называются "Status Codes", но мы их будем называть именно ошибками - так привычнее.
Код возврата - это трехзначное число, на основании которого можно судить о том, насколько успешно был обработан запрос. Код возврата начинающиеся на 1,2,3 считаются успешными, остальные причисляются к разряду ошибок.
Game: Perform tasks and rest cool.8 people play!
Play game
Вот список ошибок 4xx и 5xx : 400 - Bad Request 401 - Unauthorized 402 - Payment Required 403 - Forbidden 404 - Not Found 405 - Method Not Allowed 406 - Not Acceptable 407 - Proxy Authentication Required 408 - Request Time-out 409 - Conflict 410 - Gone 411 - Length Required 412 - Precondition Failed 413 - Request Entity Too Large 414 - Request-URI Too Large 415 - Unsupported Media Type 500 - Internal Server Error 501 - Not Implemented 502 - Bad Gateway 503 - Service Unavailable 504 - Gateway Time-out 505 - HTTP Version not supported |
При возникновении ошибки 4xx или 5xx посетитель Вашего сайта увидит в браузере сообщение от сервера, которое вряд ли можно назвать предельно понятным рядовому пользователю. Apache предоставляет возможность выдать вместо аскетичного технического текста, не изобилиющего деталями, свою страницу, где Вы можете человеческим языком объяснить пользователю, что произошло и что делать.
Пример переопределения страниц ошибок приведен ниже:
# содержание файла .htaccess: ErrorDocument 404 http://bg10.ru/error/404.htm ErrorDocument 403 http://bg10.ru/error/403.htm ErrorDocument 400 http://bg10.ru/error/400.htm ErrorDocument 500 http://bg10.ru/error/500.htm # в случае ошибки "FORBIDDEN" показывается текстовое сообщение, которое # обязательно должно начинаться с кавычки, кавычка в сообщении не выводится: |
Более подробно об обработке ошибок можно прочитать в документации по Apache на странице "Custom error responses".
Иногда браузер пользователя не может корректно определить тип кодировки выдаваемого документа. Для решения этой проблемы используемая кодировка указывается в настройках Web-сервера Apache и заголовке передаваемого документа. Причем для корректного распознания эти кодировки должны совпадать. На наших серверах по умолчанию используется кодировка cp1251
В HTML для указания кодировки используется тег:
Game: Perform tasks and rest cool.8 people play!
Play game
<meta http-equiv="content-type" content="text/html; charset=Windows-1251"> |
Наиболее часто встречаются типы кодировки для русского языка передаваемые в заголовке документа:
|
Теперь рассмотрим указание кодировки по умолчанию через .htaccess. AddDefaultCharset задает дефолтную таблицу символов (кодировку) для всех выдаваемых страниц на веб-сервере Apache. Указываем кодировку на все файлы, в которой по умолчанию получает документы браузер:
AddDefaultCharset WINDOWS-1251 |
При загрузке файла на сервер возможна перекодировка. Указываем, что все получаемые файлы будут иметь кодировкуwindows-1251, для этого напишем:
CharsetSourceEnc WINDOWS-1251 |
Если необходимо отменить перекодировку сервером файлов:
Game: Perform tasks and rest cool.8 people play!
Play game
CharsetDisable on |
Очень часто возникает необходимость запретить доступ к определенным файлам или папкам для определенных групп пользователей. В Web-сервере Apache есть встроенные средства для решения данной проблемы.
Для запрета или разрешения доступа ко всем файлам и папкам в текущей и во всех вложенных директориях используется директива Order, синтаксис ее очень прост:
Order [Deny,Allow] | [Allow,Deny] # По умолчанию Deny,Allow |
В зависимости от того, в каком порядке указаны директивы, меняется логика работы сервера. В случае, если Deny,Allow, то запрещается доступ со всех IP кроме оговоренных, в случае, если Allow,Deny, разрешается доступ со всех IP кроме оговоренных. Далее должны идти секции описания для доступа и запрета. Ключевое слово all означает со всех IP
Например, мы хотим запретить (блокировать) доступ с IP 81.222.144.12 и 81.222.144.20 и разрешить всем остальным. Нам необходимо добавить в .htaccess следующий код:
Order Allow,Deny Allow from all Deny from 81.222.144.12 81.222.144.20 |
Game: Perform tasks and rest cool.8 people play!
Play game
Order Deny,Allow Deny from all Allow from 81.222.144.12 81.222.144.20 |
Запрет или разрешение на доступ можно указывать не только на все файлы, но так же можно указывать на отдельный файл или группы файлов. Например, мы хотим запретить доступ всех пользователей, кроме IP 81.222.144.12, к файлуpasswd.html, который расположен в текущей директории:
<Files "passwd.html"> Order Deny,Allow Deny from all Allow from 81.222.144.12 </Files> |
Так же можно запретить или разрешить доступ к определенной группе файлов. Например, к файлам с расширением ".key":
<Files "\.(key)$"> Order Deny,Allow Deny from all Allow from 81.222.144.12 </Files> |
Game: Perform tasks and rest cool.8 people play!
Play game
AuthName "Protected area, need authorization" AuthType Basic AuthUserFile /home/t/test/.authfile require valid-user |
Данный файл нужно положить в ту директорию, на которую мы хотим поставить пароль.
Директива AuthName выводит сообщение при запросе пароля, все сообщение необходимо писать в одну строчку, синтаксис директивы тривиален:
AuthName "SEE TEXT" |
Директива AuthType выбирает тип аутентификации. Возможны следующие типы: Basic или Digest. Второй может не поддерживаться некоторыми браузерами, поэтому пользоваться им не рекомендуется.
AuthType Basic | Digest |
Game: Perform tasks and rest cool.8 people play!
Play gamebeget@ginger ~ # htpasswd |
Здесь не будут рассматриваться все параметры этой команды, но вы можете сами прочитать подробности, запустивhtpasswd в unix shell, или ознакомившись с соответствующей страницей документации по Apache.
Итак, изначально у нас еще нет файла с паролями и нам нужно его создать:
beget@ginger ~ # htpasswd -c authfile test1 |
Здесь не будут рассматриваться все параметры этой команды, но вы можете сами прочитать подробности, запустивhtpasswd в unix shell или ознакомившись с соответствующей страницей документации по Apache.
После выполнения данной операции htpasswd создаст файл passwords, в котором окажется пользователь test1 и его пароль в зашифрованном виде:
beget@ginger ~ $ cat .authfile test1:zgco1KREjBY8M beget@ginger ~ $ |
Game: Perform tasks and rest cool.8 people play!
Play gamebeget@ginger ~ # htpasswd .authfile test2 |
Вернемся к описанию директив паролирования директорий. Директива Require определяет пользователей, которые могут получить доступ
Require USER_NAME | valid-user |
Указывая valid-user, Вы разрешаете доступ всем пользователям, перечисленным в файле паролей.
Приведем пример для доступа определенных пользователей из файла с паролями .htpasswd
AuthName "Protected area, need authorization" AuthType Basic AuthUserFile /home/t/test/.authfile require Alexey Kondr Fenix |
Game: Perform tasks and rest cool.8 people play!
Play game
<Files "passwd.html"> AuthName "Protected area, need authorization" AuthType Basic AuthUserFile /home/t/test/.authfile require valid-user </Files> |
<Files "\.(key)$"> AuthName "Protected area, need authorization" AuthType Basic AuthUserFile /home/t/test/.authfile require valid-user </Files> |
Следует помнить, что при таком ограничении доступа пароли передаются по каналам связи в открытом виде и при определенных обстоятельствах могут быть перехвачены злоумышленниками. Поэтому в целях безопасности рекомендуется организовывать доступ к закрытым областям веб-сайта через защищенное SSL-соединение.
Game: Perform tasks and rest cool.8 people play!
Play game
php_flag имя директивы on | off php_value имя директивы VALUE |
Приведем перечень наиболее часто используемых директив
mysql.default_host |
Устанавливает имя хоста базы данных. |
mysql.default_user |
Устанавливает имя пользователя базы данных |
mysql.default_password |
Устанавливает пароль пользователя базы данных |
display_errors |
Разрешает вывод ошибок и предупреждений в браузер. |
display_startup_errors |
Включает отображение ошибок, возникающих при запуске PHP. |
error_reporting |
Определяет типы (уровни важности) фиксируемых ошибок. |
auto_prepend_file |
Определение файла, который будет выводится в начале каждого php-скрипта. Путь указывается от корня файловой системы сервера. |
auto_append_file |
Определение файла, который будет выводится в конце каждого php-скрипта. |
sendmail_from |
Устанавливает e-mail отправителя, который применяется при отправке почтовых сообщений с помощью PHP. |
user_agent |
Устанавливает строку User-agent, которая используется PHP при обращении к удаленным серверам. |
Game: Perform tasks and rest cool.8 people play!
Play gameНапример, для вывода всех сообщений об ошибках генерируемых php в .htaccess нужно прописать следующие строки:
php_flag display_errors 1 php_flag display_startup_errors 1 php_value error_reporting “E_ALL & ~E_NOTICE” |
Game: Perform tasks and rest cool.8 people play!
Play game
php_flag engine off |
В заключение, эта статья об файл настроек apache htaccess подчеркивает важность того что вы тут, расширяете ваше сознание, знания, навыки и умения. Надеюсь, что теперь ты понял что такое файл настроек apache htaccess и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Комментарии
Оставить комментарий
Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)