[html]<h3><a name="simple_redirect"></a>Директивы простого перенаправления (редирект)</h3> <br> <p>Наиболее часто используемые, и наиболее сложные директивы <strong>.htaccess</strong>. Предположим мы хотим при запросе нашего сайта переадресовать пользователя на другой URL, для этого нам необходимо в корневую директорию сайта добавить файл <strong>.htaccess</strong> со следующим содержимым <br><br></p> <div> <table width="98%"> <tbody> <tr> <td style="background-color: #82c9d8;" align="left"> <span class="STRING">Redirect</span> / http://www.example.com <span class="COMMENT"># http://www.example.com - URL На который мы перенаправляем запросы</span> </td> </tr> </tbody> </table> </div> <br> <p>более сложный пример, мы хотим определенные страницы нашего сайта переадресовывать на другие сайты <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">Redirect</span> /linux http://www.linux.org <span class="STRING">Redirect</span> /linux/download.html http://www.linux.org/dist/download_info.html <span class="STRING">Redirect</span> 301 /kernel http://www.linux.org </td> </tr> </tbody> </table> </div> <br> <p>теперь при наборе <strong>http://mysite.ru/linux</strong> будут открываться <strong>http://www.linux.org</strong>. В последнем примере WEB сервер будет передавать код 301, что означает "документ перемещен постоянно". <br> Синтаксис команды <strong>Redirect</strong> выглядит следующим образом: <br><br></p> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">Redirect</span> [<span class="NUMBER">status</span>] <span class="NUMBER">URL_LOCAL URL_REDIRECT</span> <span class="NUMBER">status</span> : <span class="COMMENT">необязательное поле, определяет код возврата, допустимые значения: * permanent (301 — документ перемещен постоянно) * temp (302 — документ перемещен временно) * seeother (303 — смотрите другой) * gone (410 — убран)</span> <span class="NUMBER">URL_LOCAL</span> : <span class="COMMENT">локальная часть URL запрашиваемого документа.</span> <span class="NUMBER">URL_REDIRECT</span> : <span class="COMMENT">URL куда должен быть выполнен редирект.</span> </td> </tr> </tbody> </table> <p> </p> <p>Директива <strong>RedirectMatch</strong> аналогична директиве <strong>Redirect</strong> за исключением того, что в <strong>RedirectMatch</strong> возможно использование регулярных выражений, что несомненно может быть удобно в некоторых условиях. Например для организации передачи параметров скрипту в теле URL. <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">RedirectMatch</span> /(.*)/(.*)/index.html$ http://mysite.ru/script.php?par1=$1&par2=$2 </td> </tr> </tbody> </table> </div> <br> <p>Хотя данныхй пример и вызовет перезагрузку страницы в дальнейшем его можно будет улучшить. Здесь необходимо сделать небольшое лирическое отступление и поговорить о <strong>синтаксисе регулярных выражений</strong>.<br><br> В регулярном выражении можно использовать любые печатные символы и пробел, но часть символов имеет особое значение:<br><br></p> <table border="0"> <tbody> <tr style="background-color: #82c9d8;"> <td width="20"> </td> <td align="left"> <li><span style="font-size: xx-small;">Круглые скобки <strong>()</strong> используются для выделения групп символов. В дальнейшем к ним можно обращаться по номеру.</span></li> <li><span style="font-size: xx-small;">Символ <strong>^</strong> обозначает начало строки.</span></li> <li><span style="font-size: xx-small;">Символ <strong>$</strong> обозначает конец строки.</span></li> <li><span style="font-size: xx-small;">Символ <strong>.</strong> обозначает любой символ.</span></li> <li><span style="font-size: xx-small;">Символ <strong>|</strong> обозначает альтернативу. Например, выражения "A|B" означают "A или B".</span></li> <li><span style="font-size: xx-small;">Символ <strong>?</strong> ставится после символа (группы), который может как присутствовать, так и отсутствовать.</span></li> <li><span style="font-size: xx-small;">Символ <strong>*</strong> ставится после символа (группы), который может отсутствовать или присутствовать неограниченное число раз подряд.</span></li> <li><span style="font-size: xx-small;">Символ <strong>+</strong> действует аналогично символу <strong>*</strong> с той лишь разницей, что предшествующий ему символ обязательно должен присутствовать хотя бы один раз.</span></li> <li><span style="font-size: xx-small;">Квадратные скобки <strong>[]</strong> используются для перечисления допустимых символов.</span></li> <li><span style="font-size: xx-small;">Квадратные скобки <strong>[^]</strong> используются для перечисления недоступных символов.</span></li> <li><span style="font-size: xx-small;">Символ <strong></strong> ставится перед спецсимволами, если они нужны в своем первозданном виде.</span></li> <li><span style="font-size: xx-small;">Все, что расположено после символа <strong>'#'</strong>, считается комментарием.</span></li> </td> </tr> </tbody> </table> <p> </p> <p>Это все основные примитивы с помощью которых можно построить любое регулярное выражение. <br><br></p> <h3><a name="mod_rewrite"></a>Директивы сложного перенаправления (mod_rewrite)</h3> <br> <p>Модуль <strong>mod_rewrite</strong> имеющийся в составе <strong>Apache</strong> — это мощнейшее, интеллектуальное средство преобразования <strong>URL</strong> адресов. С ним возможны почти все типы преобразований, которые могут выполняться или нет в зависимости от разных условий, факторов.<br> <br> Данный модуль представляет собой основанный на правилах механизм (синтаксический анализатор с применением регулярных выражений), выполняющий <strong>URL</strong> преобразования на лету. Модуль поддерживает неограниченное количество правил и связанных с каждым правилом условий, реализуя действительно гибкий и мощный механизм управления <strong>URL. URL</strong> преобразования могут использовать разные источники данныхх, например переменные сервера, переменные окружения, <strong>HTTP</strong> заголовки, время и даже запросы к внешним базам данныхх в разных форматах, — для получения <strong>URL</strong> нужного вам вида.<br> <br> Директива <strong>RewriteCond</strong> - определяет условие при котором происходит преобразование. <strong>RewriteCond</strong> определяет условия для какого-либо правила. Перед директивой <strong>RewriteRule</strong> располагаются одна или несколько директив <strong>RewriteCond</strong>. Следующее за ними правило преобразования используется только тогда, когда <strong>URI</strong> соответствует условиям этой директивы и также условиям этих дополнительных директив.<br> <br> Под <strong>обратной связью</strong> подразумевается использование частей сравниваемых <strong>URL</strong> для дальнейшего использования, т.е. как передачи параметров или для построения нового <strong>URL</strong>.<br><br></p> <table border="0"> <tbody> <tr> <td style="background-color: #82c9d8;"> <h3>$N</h3> </td> <td style="background-color: #dee26e;"> <p>(0 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteRule (единственной, следующей сразу за текущим набором директив RewriteCond). <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"> <h3>%N</h3> </td> <td style="background-color: #dee26e;"> <p>(1 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteCond в текущем наборе условий. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"> <h3>%{NAME_OF_VARIABLE}</h3> </td> <td style="background-color: #dee26e;"> <p>где <strong>NAME_OF_VARIABLE</strong> может быть одной из ниже приведенных переменных</p> </td> </tr> </tbody> </table> <p> </p> <p>Ниже приводится список всех доступных переменных <strong>%{NAME_OF_VARIABLE}</strong> с их кратким описанием. <br><br></p> <table border="0"> <tbody> <tr> <td style="background-color: #82c9d8;"><strong>HTTP_USER_AGENT</strong></td> <td style="background-color: #dee26e;"> <p>Содержит информацию о типе и версии браузера и операционной системы посетителя. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>HTTP_REFERER</strong></td> <td style="background-color: #dee26e;"> <p>Приводится адрес страницы, с которой посетитель пришёл на данную страницу. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>HTTP_COOKIE</strong></td> <td style="background-color: #dee26e;"> <p>Список COOKIE передаваемых браузером <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>HTTP_FORWARDED</strong></td> <td style="background-color: #dee26e;"> <p>Страница непосредственно с которой перешел пользователь <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>HTTP_HOST</strong></td> <td style="background-color: #dee26e;"> <p>Адрес сервера, например dvigov.com <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>HTTP_ACCEPT</strong></td> <td style="background-color: #dee26e;"> <p>Описываются предпочтения клиента относительно типа документа. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>REMOTE_ADDR</strong></td> <td style="background-color: #dee26e;"> <p>IP-адрес посетителя. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>REMOTE_HOST</strong></td> <td style="background-color: #dee26e;"> <p>адрес посетителя в нормальной форме — например, rt99.net.ru <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>REMOTE_IDENT</strong></td> <td style="background-color: #dee26e;"> <p>Имя удаленного пользователя. Имеет формат имя.хост, например, kondr.www.rtt99.net.ru <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>REMOTE_USER</strong></td> <td style="background-color: #dee26e;"> <p>То-же, что и REMOTE_IDENT, но содержит только имя. Пример: <strong>kondr</strong> <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>REQUEST_METHOD</strong></td> <td style="background-color: #dee26e;"> <p>Позволяет определить тип запроса (GET или POST). Должен обязательно анализироваться, т.к. определяет дальнейший способ обработки информации <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>SCRIPT_FILENAME</strong></td> <td style="background-color: #dee26e;"> <p>Полный путь к вебстранице на сервере. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>PATH_INFO</strong></td> <td style="background-color: #dee26e;"> <p>Содержит в себе все, что передавалось в скрипт. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>QUERY_STRING</strong></td> <td style="background-color: #dee26e;"> <p>Содержит строчку, переданную в качестве запроса при вызове <strong>CGI</strong> скрипта. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>AUTH_TYPE</strong></td> <td style="background-color: #dee26e;"> <p>Используется для идентификации пользователя <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>DOCUMENT_ROOT</strong></td> <td style="background-color: #dee26e;"> <p>Cодержит путь к корневой директории сервера. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>SERVER_ADMIN</strong></td> <td style="background-color: #dee26e;"> <p>Почтовый адрес владельца сервера, указанный при установке. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>SERVER_NAME</strong></td> <td style="background-color: #dee26e;"> <p>Адрес сервера, типа dvigov.com <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>SERVER_ADDR</strong></td> <td style="background-color: #dee26e;"> <p>IP-адрес вашего сайта. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>SERVER_PORT</strong></td> <td style="background-color: #dee26e;"> <p>Порт на котором работает Apache. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>SERVER_PROTOCOL</strong></td> <td style="background-color: #dee26e;"> <p>Версия <strong>HTTP</strong> протокола. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>SERVER_SOFTWARE</strong></td> <td style="background-color: #dee26e;"> <p>Название сервера, например, <strong>Apache/1.3.2 (Unix)</strong> <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>TIME_YEAR<br> TIME_MON<br> TIME_DAY<br> TIME_HOUR<br> TIME_MIN<br> TIME_SEC<br> TIME_WDAY<br> TIME</strong><br><br></td> <td style="background-color: #dee26e;"> <p>Переменные предназначены для работы со временем в разных форматах. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>API_VERSION</strong></td> <td style="background-color: #dee26e;"> <p>Это версия <strong>API</strong> модуля <strong>Apache</strong> (внутренний интерфейс между сервером и модулем) в текущей сборке сервера, что определено в <strong>include/ap_mmn.h</strong>. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>THE_REQUEST</strong></td> <td style="background-color: #dee26e;"> <p>Полная строка <strong>HTTP</strong> запроса отправленная браузером серверу (т.е., <strong>«GET /index.html HTTP/1.1»</strong>). Она не включает какие-либо дополнительные заголовки отправляемые браузером. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>REQUEST_URI</strong></td> <td style="background-color: #dee26e;"> <p>Ресурс, запрошенный в строке HTTP запроса. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>REQUEST_FILENAME</strong></td> <td style="background-color: #dee26e;"> <p>Полный путь в файловой системе сервера к файлу или скрипту соответствующим этому запросу. <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;"><strong>IS_SUBREQ</strong></td> <td style="background-color: #dee26e;"> <p>Будет содержать текст «true» если запрос выполняется в текущий момент как подзапрос, «false» в другом случае. Подзапросы могут быть сгенерированы модулями которым нужно иметь дело с дополнительными файлами или URI для того чтобы выполнить собственные задачи. <br><br></p> </td> </tr> </tbody> </table> <p> </p> <p>Условие это шаблон условия, т.е., какое-либо регулярное выражение применяемое к текущему экземпляру "Сравниваемая Строка", т.е., "Сравниваемая Строка" просматривается на поиск соответствия Условие. <br><br> Помните: Условие это <strong>perl</strong> совместимое регулярное выражение с некоторыми дополнениями: <br> <br></p> <table border="0"> <tbody> <tr style="background-color: #82c9d8;"> <td width="20"> </td> <td align="left"> <li><span style="font-size: xx-small;">Вы можете предварять строку шаблона префиксом <strong>'!'</strong> для указания несоответствия шаблону.</span></li> <li><span style="font-size: xx-small;"><strong>'<Условие'</strong> (лексически меньше)</span></li> <li><span style="font-size: xx-small;"><strong>'>Условие'</strong> (лексически больше)</span></li> <li><span style="font-size: xx-small;"><strong>'=Условие'</strong> (лексически равно)</span></li> <li><span style="font-size: xx-small;"><strong>'-d'</strong> (является ли каталогом)</span></li> <li><span style="font-size: xx-small;"><strong>'-f'</strong> (является ли обычным файлом)</span></li> <li><span style="font-size: xx-small;"><strong>'-s'</strong> (является ли обычным файлом с ненулевым размером)</span></li> <li><span style="font-size: xx-small;"><strong>'-l'</strong> (является ли символической ссылкой)</span></li> <li><span style="font-size: xx-small;"><strong>'-F'</strong> (проверка существования файла через подзапрос)</span></li> <li><span style="font-size: xx-small;"><strong>'-U'</strong> (проверка существования URL через подзапрос)</span></li> </td> </tr> </tbody> </table> <p> </p> <p>Все эти проверки также могут быть предварены префиксом восклицательный знак ('!') для инвертирования их значения.<br> <br> <strong>RewriteEngine</strong> включает или выключает работу механизма преобразования. Если она установлена в положение <strong>off</strong> этот модуль совсем не работает. Отметьте, что по-умолчанию, настройки преобразований не наследуются. Это означает что вы должны иметь RewriteEngine on директиву для каждого виртуального хоста в котором вы хотите использовать этот модуль.<br> Синтаксис <strong>RewriteEngine</strong> выглядит следующим образом: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">RewriteEngine</span> <span class="KEYWORD">on</span> | <span class="KEYWORD">off</span> # По умолчанию RewriteEngine off </td> </tr> </tbody> </table> </div> <br> <p>Используйте для комбинирования условий в правилах <strong>OR</strong> вместо <strong>AND</strong>. Типичный пример - перенавравление запросов на поддомены в отдельные каталоги. <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">RewriteEngine</span> <span class="KEYWORD">on</span> <span class="STRING">RewriteCond</span> %{REMOTE_HOST} ^mysubdomain1.* [<span class="KEYWORD">OR</span>] <span class="STRING">RewriteCond</span> %{REMOTE_HOST} ^mysubdomain2.* [<span class="KEYWORD">OR</span>] <span class="STRING">RewriteCond</span> %{REMOTE_HOST} ^mysubdomain3.* <span class="STRING">RewriteRule</span> ^(.*)$ ^mysubdomain_public_html/$1 <span class="STRING">RewriteCond</span> %{REMOTE_HOST} ^mysubdomain4.* <span class="STRING">RewriteRule</span> ^(.*)$ ^mysubdomain4_public_html/$1
</td> </tr> </tbody> </table> </div> <br> <p>Для выдачи главной страницы какого-либо сайта согласно <strong>«User-Agent:»</strong> заголовку запроса, вы можете использовать следующие директивы: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">RewriteEngine</span> <span class="KEYWORD">on</span> <span class="STRING">RewriteCond</span> %{HTTP_USER_AGENT} ^Mozilla.* <span class="STRING">RewriteRule</span> ^/$ /homepage.max.html [<span class="KEYWORD">L</span>] <span class="STRING">RewriteCond</span> %{HTTP_USER_AGENT} ^Lynx.* <span class="STRING">RewriteRule</span> ^/$ /homepage.min.html [<span class="KEYWORD">L</span>] <span class="STRING">RewriteRule</span> ^/$ /homepage.std.html [<span class="KEYWORD">L</span>] </td> </tr> </tbody> </table> </div> <br> <p>Для выдачи разных сайтов для разных браузеров согласно <strong>«User-Agent:»</strong> заголовку запроса, вы можете использовать следующие директивы: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">RewriteEngine</span> <span class="KEYWORD">on</span> <span class="STRING">RewriteCond</span> %{HTTP_USER_AGENT} ^Mozilla.* <span class="STRING">RewriteRule</span> ^(.*)$ /mozilla/$1 [<span class="KEYWORD">L</span>] <span class="STRING">RewriteCond</span> %{HTTP_USER_AGENT} ^Lynx.* <span class="STRING">RewriteRule</span> ^(.*)$ /lynx/$1 [<span class="KEYWORD">L</span>] <span class="STRING">RewriteRule</span> ^(.*)$ /default/$1 [<span class="KEYWORD">L</span>] </td> </tr> </tbody> </table> </div> <br> <p>Общий синтаксис директивы <strong>RewriteRule</strong> выглядит следующим образом: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">RewriteRule</span> <span class="NUMBER">Шаблонн Подстановка</span> [<span class="NUMBER">flag</span>] <span class="COMMENT"># flag - необязательное поле указывающее дополнительные опции</span> </td> </tr> </tbody> </table> </div> <br> <p>В подстановке вы можете использовать, в том числе, и специальные флаги путем добавления в качестве третьего аргумента директивы <strong>RewriteRule</strong>. Флаги — это разделённый запятыми, следующий список флагов:<br> <br> <span class="ACCENT">'redirect|R [=code]'</span> <br> (вызывает редирект)<br> <span style="font-size: xx-small; background-color: #ffff00;"> Префикс в Подстановке вида <strong>http://thishost[:thisport]/</strong> (создающий новый <strong>URL</strong> из какого-либо <strong>URI</strong>) запускает внешний редирект (перенаправление). Если нет никакого кода в подстановке ответ будет с <strong>HTTP</strong> статусом 302 (ВРЕМЕННО ПЕРЕМЕЩЕН). Для остановки процесса преобразования, вам также нужно написать флаг <strong>'L'</strong>. </span><br> <br> <span class="ACCENT">'forbidden|F [=code]'</span> <br> (делает URL запрещенным)<br> <span style="font-size: xx-small; background-color: #ffff00;"> Это делает текущий <strong>URL</strong> запрещённым, например, клиенту немедленно отправляется ответ с <strong>HTTP</strong> статусом 403 (ЗАПРЕЩЕНО). Используйте этот флаг в сочетании с соответствующими <strong>RewriteConds</strong> для блокирования <strong>URL</strong> по некоторым критериям.</span><br> <br> <span class="ACCENT">'gone|G [=code]'</span> <br> (делает URL «мёртвым»)<br> <span style="font-size: xx-small; background-color: #ffff00;"> Этот флаг делает текущий <strong>URL</strong> «мертвым», т.е., немедленно отправляется <strong>HTTP</strong> ответ со статусом 410 (<strong>GONE</strong>). Используйте этот флаг для маркировки «мертвыми» не существующие более страницы. </span><br><br> <span class="ACCENT">'proxy|P [=code]'</span> <br> (вызвает прокси)<br> <span style="font-size: xx-small; background-color: #ffff00;"> Этот флаг помечает подстановочную часть как внутренний запрос прокси и немедленно (т.е., процесс преобразования здесь останавливается) пропускает его через прокси модуль. Используйте этот флаг для того, чтобы добиться более мощной реализации диркетивы <strong>ProxyPass</strong>, интегрирующей некоторое содержимое на удаленных серверах, в пространство имён локального сервера. </span><br><br> <span class="ACCENT">'last|L [=code]'</span> <br> (последнее правило)<br> <span style="font-size: xx-small; background-color: #ffff00;"> Остановить процесс преобразования на этом месте и не применять больше никаких правил преобразований. Используйте этот флаг для того, чтобы не преобразовывать текущий <strong>URL</strong> другими, следующими за этим, правилами преобразований. </span><br><br> <span class="ACCENT">'next|N [=code]'</span> <br> (следуюший раунд)<br> <span style="font-size: xx-small; background-color: #ffff00;"> Перезапустить процесс преобразований (начав с первого правила). В этом случае <strong>URL</strong> снова сопоставляется неким условиям, но не оригинальный <strong>URL</strong>, а <strong>URL</strong> вышедший из последнего правила преобразования.Используйте этот флаг для перезапуска процесса преобразований, т.е., безусловному переходу на начало цикла. </span><br><br> <span class="ACCENT">'chain|C [=code]'</span> <br> (связь со следующим правилом)<br> <span style="font-size: xx-small; background-color: #ffff00;"> Этот флаг связывает текущее правило со следующим (которое, в свою очередь, может быть связано со следующим за ним, и т.д.). Это имеет следующий эффект: если есть соответствие правилу, процесс продолжается как обычно, т.е., флаг не производит никакого эффекта. Если правило не соответствует условию, все следующие, связанные правила, пропускаются. </span><br><br> <span class="ACCENT">'type|T=MIME-тип [=code]'</span><br> (принудительно установить MIME тип)<br> <span style="font-size: xx-small; background-color: #ffff00;"> Принудительно установить <strong>MIME-тип</strong> целевого файла в <strong>MIME-тип</strong>. К примеру, это можно использовать для имитации <strong>mod_alias</strong> директивы <strong>ScriptAlias</strong> которая принудительно устанавливает для всех файлов внутри отображаемого каталога <strong>MIME</strong> тип равный <strong>«application/x-httpd-cgi»</strong>. </span><br><br> <span class="ACCENT">'nosubreq|NS [=code]'</span><br> (используется только в случае не внутреннего подзапроса)<br> <span style="font-size: xx-small; background-color: #ffff00;"> Этот флаг дает команду механизму преобразований пропустить директиву если текущий подзапрос является внутренним подзапросом. К примеру, внутренние подзапросы в <strong>Apache</strong> происходят тогда, когда mod_include пытается получить информацию о возможных файлах по-умолчанию для каталогов (index.xxx). При подзапросах это не всегда полезно и даже иногда вызывает проблему в работе набора директив преобразований. Используйте этот флаг для исключения некоторых правил. </span><br><br> <span class="ACCENT">'nocase|NC [=code]'</span> <br> (не учитывать регистр)<br><span style="font-size: xx-small; background-color: #ffff00;"> Это делает Шаблонн нечуствительным к регистру, т.е., нет различий между 'A-Z' и 'a-z' когда Шаблонн применяется к текущему <strong>URL</strong>. </span><br><br> <span class="ACCENT">'qsappend|QSA [=code]'</span> <br> (добавлять строку запроса)<br> <span style="font-size: xx-small; background-color: #ffff00;"> Этот флаг указывает механизму преобразований на добавление, а не замену, строки запроса из <strong>URL</strong> к существующей, в строке подстановки. Используйте это когда вы хотите добавлять дополнительные данныхе в строку запроса с помощью директив преобразований. </span><br><br> <span class="ACCENT">'noescape|NE [=code]'</span> <br> (не экранировать URI при выводе)<br><span style="font-size: xx-small; background-color: #ffff00;"> Этот флаг не даёт <strong>mod_rewrite</strong> применять обычные правила экранирования <strong>URI</strong> к результату преобразования. Обычно, специальные символы (такие как '%', '$', ';', и так далее) будут экранированы их шестнадцатиричными подстановками ('%25', '%24', и '%3B', соответственно); этот флаг не дает это делать. </span><br><br> Если в подкаталогах в <strong>.htaccess</strong> нет ни одной директивы модуля <strong>mod_rewrite</strong>, то все правила преобразования наследуются из родительского каталога.<br> <br> При наличии в файле .htaccess каких либо директив модуля <strong>mod_rewrite</strong> не наследуется ничего, а состояние по умолчанию выставляется таким же, как в главном конфигурационном файле веб-сервера (по умолчанию "off"). Поэтому, если нужны правила преобразования для конкретного каталога, то нужно еще раз вставить директиву "<strong>RewriteEngine on</strong>" в <strong>.htaccess</strong> для конкретного каталога.<br> <br> При наследовании правил из верхних каталогов и добавлении к ним новых свойственных только данному каталогу - необходимо выставить в начале следующее: "<strong>RewriteEngine on</strong>" и "<strong>RewriteOptions inherit</strong>" - последняя директива сообщает серверу о продолжении. <br> <br> При наследовании правил из верхних каталогов и добавлении к ним новых свойственных только данному каталогу - необходимо выставить в начале следующее: <strong>"RewriteEngine on"</strong> и <strong>"RewriteOptions inherit"</strong> - последняя директива сообщает серверу о продолжении. <br> <br> <!--colorstart: red--> <span style="color: red"><!--/colorstart-->Примеры<!--colorend--></span><!--/colorend--> использования <strong>mod_rewrite</strong> можно посмотреть тут<br> <br><br></p> <h3><a name="index"></a>Индексные страницы</h3> <br> <p>Когда пользователь заходит на хост например <strong>http://gentoo.org</strong> принято, что открывается индексный файл index.* при его отсутствии - либо содержимое каталога, либо ошибку 403 (<strong>FORBIDDEN</strong>) если опция отключена - запрещен просмотр директорий.<br> <br> За листинг файлов отвечает директива <strong>Indexes</strong> (показывать посетителю список файлов, если в выбранном каталоге нет файла <strong>index.html</strong> или его аналога).<br> <br> Иногда нужно сделать так, чтобы в случае отсутствия в каталоге файла, который показывается по умолчанию, листинг, то есть список файлов в каталоге, не выдавался. В этом случае добавим в <strong>.htaccess</strong> такую строчку: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="COMMENT"># Запрет выдачи листинга пустого каталога</span> <span class="STRING">Options</span> <span class="KEYWORD">-Indexes</span> </td> </tr> </tbody> </table> </div> <br> <p>А чтобы выдавал листинг, нужно: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">Options</span> <span class="KEYWORD">Indexes</span> </td> </tr> </tbody> </table> </div> <br> <p>Если же понадобиться разрешить просматривать список файлов, но чтобы при этом чаcть файлов определенного формата не отображалась, то запишем:. <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">IndexIgnore</span> *.php* *.pl </td> </tr> </tbody> </table> </div> <br> <p>Выдает листинг каталога, т.е. его содержание со всем содержанием, за исключением файлов-скриптов <strong>PHP</strong> и <strong>Perl</strong>. <br><br> Если ваш веб-сайт построен на скриптах, то в качестве индексных часто могут использоваться файлы с другими расширениями - указать эти файлы можно с помощью директивы <strong>DirectoryIndex</strong> . <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">DirectoryIndex</span> index.html index.shtml index.pl index.cgi index.php </td> </tr> </tbody> </table> </div> <br> <p>Если же вы хотите что бы при обращении к каталогу открывался не <strong>index.html</strong>, а например, файл <strong>htaccess.php</strong> или <strong>/cgi-bin/index.pl</strong>: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">DirectoryIndex</span> htaccess.php /cgi-bin/index.pl </td> </tr> </tbody> </table> </div> <br> <br> <br> <h3><a name="error_page"></a>Обработка ошибок</h3> <br> <p>В ходе работы сервера иногда возникают ошибки, скорее это будет правильней назвать не сбоями в работе сервера, а стандартными кодами возврата оговоренными в стандарте HTTP_RFC2616. Вообще, в <strong>RFC</strong> ошибки называются "<strong>Status Codes</strong>", но мы их будем называть именно ошибками - так привычнее.<br> <br> Код возврата - это трехзначное число, на основании которого можно судить о том, насколько успешно был обработан запрос. Код возврата начинающиеся на 1,2,3 считаются успешными, остальные причисляются к разряду ошибок. <br> <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> Вот список ошибок 4xx и 5xx : <span class="KEYWORD">400</span> - <span class="COMMENT">Bad Request</span> <span class="KEYWORD">401</span> - <span class="COMMENT">Unauthorized</span> <span class="KEYWORD">402</span> - <span class="COMMENT">Payment Required</span> <span class="KEYWORD">403</span> - <span class="COMMENT">Forbidden</span> <span class="KEYWORD">404</span> - <span class="COMMENT">Not Found</span> <span class="KEYWORD">405</span> - <span class="COMMENT">Method Not Allowed</span> <span class="KEYWORD">406</span> - <span class="COMMENT">Not Acceptable</span> <span class="KEYWORD">407</span> - <span class="COMMENT">Proxy Authentication Required</span> <span class="KEYWORD">408</span> - <span class="COMMENT">Request Time-out</span> <span class="KEYWORD">409</span> - <span class="COMMENT">Conflict</span> <span class="KEYWORD">410</span> - <span class="COMMENT">Gone</span> <span class="KEYWORD">411</span> - <span class="COMMENT">Length Required</span> <span class="KEYWORD">412</span> - <span class="COMMENT">Precondition Failed</span> <span class="KEYWORD">413</span> - <span class="COMMENT">Request Entity Too Large</span> <span class="KEYWORD">414</span> - <span class="COMMENT">Request-URI Too Large</span> <span class="KEYWORD">415</span> - <span class="COMMENT">Unsupported Media Type</span> <span class="KEYWORD">500</span> - <span class="COMMENT">Internal Server Error</span> <span class="KEYWORD">501</span> - <span class="COMMENT">Not Implemented</span> <span class="KEYWORD">502</span> - <span class="COMMENT">Bad Gateway</span> <span class="KEYWORD">503</span> - <span class="COMMENT">Service Unavailable</span> <span class="KEYWORD">504</span> - <span class="COMMENT">Gateway Time-out</span> <span class="KEYWORD">505</span> - <span class="COMMENT">HTTP Version not supported</span> </td> </tr> </tbody> </table> </div> <br> <p>При возникновении ошибки 4xx или 5xx посетитель Вашего сайта увидит в браузере сообщение от сервера, которое врядlли можно назвать предельно понятным рядовому пользователю. <strong>Apache</strong> предоставляет возможность выдать вместо аскетичного технического текста, не изобилующего деталями, свою страницу, где Вы можете человеческим языком объяснить пользователю, что произошло и что делать.<br> <br> Пример переопределения страниц ошибок приведен ниже: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="COMMENT"># содержание файла .htaccess:</span> <span class="STRING">ErrorDocument</span> <span class="KEYWORD">404</span> http://bg10.ru/error/404.htm <span class="STRING">ErrorDocument</span> <span class="KEYWORD">403</span> http://bg10.ru/error/403.htm <span class="STRING">ErrorDocument</span> <span class="KEYWORD">400</span> http://bg10.ru/error/400.htm <span class="STRING">ErrorDocument</span> <span class="KEYWORD">500</span> http://bg10.ru/error/500.htm <span class="COMMENT"># в случае ошибки "FORBIDDEN" показывается текстовое сообщение, которое # обязательно должно начинаться с кавычки, кавычка в сообщении не выводится:</span> <span class="STRING">ErrorDocument</span> <span class="KEYWORD">403</span> "Sorry can't allow you access today, 403 Status Codes Apache" </td> </tr> </tbody> </table> </div> <br> <p>Более подробно об обработке ошибок можно прочитать в документации по <strong>Apache</strong> на странице <a href="http://httpd.apache.org/docs/custom-error.html" target="_blank">"Custom error responses"</a>. <br> <br> <br></p> <h3><a name="code_page"></a>Кодировка</h3> <br> <p>Иногда браузер пользователя не может корректно определить тип кодировки выдаваемого документа. Для решения этой проблемы используемая кодировка указывается в настройках <strong>Web</strong> сервера <strong>Apache</strong> и заголовке передаваемого документа. Причем для корректного распознания эти кодировки должны совпадать. На наших серверах по умолчанию используется кодировка <strong>cp1251</strong><br> <br> В HTML для указания кодировки используется тег: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="NUMBER"><meta http-equiv="</span><span class="KEYWORD">content-type</span><span class="NUMBER">" content="</span> <span class="KEYWORD">text/html; charset=Windows-1251</span><span class="NUMBER">"></span> </td> </tr> </tbody> </table> </div> <br> <p>Наиболее часто встречаются типы кодировки для русского языка передаваемые в заголовке документа: <br> <br></p> <table border="0"> <tbody> <tr> <td width="20"> </td> <td style="background-color: #82c9d8;" align="left"> <li><span style="font-size: xx-small;">Windows-1251 - Кириллица (Windows).</span></li> <li><span style="font-size: xx-small;">KOI8-r - Кириллица (КОИ8-Р)</span></li> <li><span style="font-size: xx-small;">cp866 - Кириллица (DOS).</span></li> <li><span style="font-size: xx-small;">Windows-1252 - Западная Европа (Windows).</span></li> <li><span style="font-size: xx-small;">Windows-1250 - Центральная Европа (Windows).</span></li> <li><span style="font-size: xx-small;">UTF-8 - двух байтовая кодировка</span></li> </td> </tr> </tbody> </table> <p> </p> <p>Теперь рассмотрим указание кодировки по умолчанию через <strong>.htaccess</strong>. <strong>AddDefaultCharset</strong> задает дефолтную таблицу символов (кодировку) для всех выдаваемых страниц на веб сервере <strong>Apache</strong>. Указываем кодировку на все файлы, в которой по умолчанию получает документы браузер: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">AddDefaultCharset</span> WINDOWS-1251 </td> </tr> </tbody> </table> </div> <br> <p>При загрузке файла на сервер, возможна перекодировка, его - указываем, что все получаемые файлы будут иметь кодировку <strong>windows-1251</strong>, для того что бы указать кодировку на загружаемые файлы напишем: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">CharsetSourceEnc</span> WINDOWS-1251 </td> </tr> </tbody> </table> </div> <br> <p>Если необходимо отменить перекодировку сервером файлов: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">CharsetDisable</span> <span class="KEYWORD">on</span> </td> </tr> </tbody> </table> </div> <br> <br> <h3><a name="access"></a>Управление доступом</h3> <br> <p>Очень часто возникает необходимость запретить доступ к определенным файлам или папкам для определенных груп пользователей. В <strong>Web</strong> сервере <strong>Apache</strong> есть встроенные средства для решения данной проблемы.<br> <br> Для запрета или разрешения доступа ко всем файлам и папкам в текущей и во всех вложенных директориях используется директива <strong>Order</strong> синтаксис ее очень прост: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">Order</span> [<span class="NUMBER">Deny,Allow</span>] | [<span class="NUMBER">Allow,Deny</span>] <span class="COMMENT"># По умолчанию Deny,Allow</span> </td> </tr> </tbody> </table> </div> <br> <p>В зависимости от того в каком порядке указаны директивы меняется логика работы сервера. В случае если Deny,Allow то запрещается доступ со всех IP кроме оговоренных, в случае если Allow,Deny разрешается доступ со всех IP кроме оговоренных. Далее должны идти секции описания для доступа и запрета. Ключевое слово <strong>all</strong> означает со всех <strong>IP</strong><br> <br> Например мы хотим запретить (блокировать) доступ с <strong>IP</strong> 81.222.144.12 и 81.222.144.20 и разрешить всем остальным нам необходимо добавить в <strong>.htaccess</strong> следующий код: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">Order</span> Allow,Deny <span class="STRING">Allow from</span> all <span class="STRING">Deny from</span> 81.222.144.12, 81.222.144.20 </td> </tr> </tbody> </table> </div> <br> <p>Для обратной ситуации когда мы хотим запретить доступ со всех <strong>IP</strong> кроме 81.222.144.12 и 81.222.144.20 нам необходимо добавить в <strong>.htaccess</strong> следующий код: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">Order</span> Deny,Allow <span class="STRING">Deny from</span> all <span class="STRING">Allow from</span> 81.222.144.12, 81.222.144.20 </td> </tr> </tbody> </table> </div> <br> <p>Запрет или разрешение на доступ можно указывать не только на все файлы, но так же можно указывать на отдельный файл или группы файлов. Например мы хотим запретить доступ всех пользователей кроме <strong>IP</strong> 81.222.144.12 к файлу <strong>passwd.html</strong> который расположен в текущей директории. <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <<span class="STRING">Files</span> "<span class="KEYWORD">passwd.html</span>"> <span class="STRING"> Order</span> Deny,Allow <span class="STRING"> Deny from</span> all <span class="STRING"> Allow from</span> 81.222.144.12 </<span class="STRING">Files</span>> </td> </tr> </tbody> </table> </div> <br> <p>Так же можно запретить или разрешить доступ к определенной группе файлов. Например к файлам с расширением "<strong>.key</strong>": <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <<span class="STRING">Files</span> "<span class="KEYWORD">.(key)$</span>"> <span class="STRING"> Order</span> Deny,Allow <span class="STRING"> Deny from</span> all <span class="STRING"> Allow from</span> 81.222.144.12 </<span class="STRING">Files</span>>
</td> </tr> </tbody> </table> </div> <br> <br> <h3><a name="passwd"></a>Паролирование директорий</h3> <br> <p><strong>.htaccess</strong> можно так же использовать для установки пароля на доступ к определенным папкам, файлам и группам файлов. Приведем рабочий пример, а потом поясним все содержимое: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">AuthName</span> "<span class="KEYWORD">Protected area, need authorization</span>" <span class="STRING">AuthType</span> Basic <span class="STRING">AuthUserFile</span> /home/t/test/.authfile <span class="STRING">require</span> valid-user </td> </tr> </tbody> </table> </div> <br> <p>Данный файл нужно положить в ту директории, на которую мы хотим поставить пароль.<br> <br> Директива <strong>AuthName</strong> выводит сообщение при запросе пароля, все сообщение необходимо писать в одну строчку, синтаксис директивы тривиален:<br> <br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">AuthName</span> "<span class="KEYWORD">SEE TEXT</span>" </td> </tr> </tbody> </table> </div> <br> <p>Директива <strong>AuthType</strong> выбирает тип аутентификации. Возможны следующие типы: <strong>Basic</strong> или <strong>Digest</strong>. Второй может не поддерживаться некоторыми браузерами, поэтому пользоваться им не рекомендуется. <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">AuthType</span> <span class="NUMBER">Basic</span> | <span class="NUMBER">Digest</span> </td> </tr> </tbody> </table> </div> <br> <p><strong>AuthUserFile</strong> указывает имя файла с паролями для аутентификации пользователей (пароли в этом файле будут шифрованными). Путь к файлу с паролями задается относительно корня веб-сервера. Храните файл с паролями в папке, доступ к которой закрыт для пользователей - (желательно поместить этот файл вне иерархии вашего веб-сайта).<br> <br> Создать данныхй файл можно двумя способами. Если у Вас установлена операционная система семейства <strong>Windows</strong> вы можете скачать <a href="http://dvigov.com/upload/passwd.exe">отсюда</a> программу которая генирирует данныхй файл. Либо подключится к серверу по <strong>SSH</strong> (инструкцию по подключению можно найти <a href="http://dvigov.com/art1.html">тут</a>) и воспользоваться утилитой <strong>htpasswd</strong>. <br> <br> Запустив <strong>htpasswd</strong> без параметров мы увидим: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"><code><span class="NUMBER"><!--colorstart: green--><span style="color: green"><!--/colorstart-->beget@ginger<!--colorend--></span><!--/colorend--> <!--colorstart: blue--><span style="color: blue"><!--/colorstart--> ~ # <!--colorend--></span><!--/colorend--> htpasswd<br> Usage:<br> htpasswd [-cmdps] passwordfile username<br> htpasswd -b[cmdps] passwordfile username password<br> -c Create a new file.<br> <!--colorstart: green--><span style="color: green"><!--/colorstart-->beget@ginger<!--colorend--></span> <!--/colorend--><!--colorstart: blue--><span style="color: blue"><!--/colorstart--> ~ #<!--colorend--></span><!--/colorend--></span></code></td> </tr> </tbody> </table> </div> <br> <p>Здесь не будут рассматриваться все параметры этой команды, но вы можете сами прочитать подробности, запустив <strong>htpasswd</strong> в <strong>unix shell</strong> или ознакомившись с соответствующей <a href="http://httpd.apache.org/docs/programs/htpasswd.html" target="_blank">страницей документации по Apache</a>. <br> <br> Итак, изначально у нас еще нет файла с паролями и нам нужно его создать: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"><code><span class="NUMBER"><!--colorstart: green--><span style="color: green"><!--/colorstart-->beget@ginger<!--colorend--></span><!--/colorend--> <!--colorstart: blue--><span style="color: blue"><!--/colorstart--> ~ # <!--colorend--></span><!--/colorend--> htpasswd -c authfile test1<br> New password:<br> Re-type new password<br> Adding password for user test1<br> <!--colorstart: green--><span style="color: green"><!--/colorstart-->beget@ginger<!--colorend--></span> <!--/colorend--><!--colorstart: blue--><span style="color: blue"><!--/colorstart--> ~ #<!--colorend--></span><!--/colorend--></span></code></td> </tr> </tbody> </table> </div> <br> <br> <p>Здесь не будут рассматриваться все параметры этой команды, но вы можете сами прочитать подробности, запустив <strong>htpasswd</strong> в <strong>unix shell</strong> или ознакомившись с соответствующей <a>страницей документации по Apache.</a></p> <p>После выполнения данной операции <strong>htpasswd</strong> создаст файл <strong>passwords</strong>, в котором окажется пользователь <strong>test1</strong> и его пароль в зашифрованном виде: <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="NUMBER"><!--colorstart: green--><span style="color: green"><!--/colorstart-->beget@ginger<!--colorend--></span><!--/colorend--><!--colorstart: blue--> <span style="color: blue"><!--/colorstart--> ~ $<!--colorend--></span><!--/colorend--> cat .authfile test1:zgco1KREjBY8M <!--colorstart: green--><span style="color: green"><!--/colorstart-->beget@ginger<!--colorend--></span><!--/colorend--><!--colorstart: blue--><span style="color: blue"> <!--/colorstart--> ~ $<!--colorend--></span><!--/colorend--></span> </td> </tr> </tbody> </table> </div> <br> <p>А теперь мы хотим добавить еще одного пользователя. Так как файл с паролями у нас уже есть, мы просто не будем использовать ключ '-c' : <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"><code><span class="NUMBER"><!--colorstart: green--><span style="color: green"><!--/colorstart-->beget@ginger<!--colorend--></span><!--/colorend--> <!--colorstart: blue--><span style="color: blue"><!--/colorstart--> ~ # <!--colorend--></span><!--/colorend--> htpasswd .authfile test2<br> New password:<br> Re-type new password:<br> Adding password for user test2<br> <br> <!--colorstart: green--><span style="color: green"><!--/colorstart-->beget@ginger<!--colorend--></span><!--/colorend--><!--colorstart: blue--> <span style="color: blue"><!--/colorstart--> ~ $<!--colorend--></span><!--/colorend--> cat .authfile<br> test1:zgco1KREjBY8M<br> test2:eN3uA6t0kzV1c<br> <!--colorstart: green--> <span style="color: green"><!--/colorstart-->beget@ginger<!--colorend--></span><!--/colorend--><!--colorstart: blue--><span style="color: blue"><!--/colorstart--> ~ $<!--colorend--> </span><!--/colorend--></span></code></td> </tr> </tbody> </table> </div> <br> <p>Вернемся к описанию директив паролирования директорий. Директива <strong>Require</strong> определяет пользователей, которые могут получить доступ <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">Require</span> <span class="NUMBER">USER_NAME</span> | <span class="NUMBER">valid-user</span> </td> </tr> </tbody> </table> </div> <br> <p>Указывая <strong>valid-user</strong> вы разрешаете доступ всем пользователям, перечисленным в файле паролей. <br> <br> Приведем пример для доступа определенных пользователей из файла с паролями <strong>.htpasswd</strong> <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <span class="STRING">AuthName</span> "<span class="KEYWORD">Protected area, need authorization</span>" <span class="STRING">AuthType</span> Basic <span class="STRING">AuthUserFile</span> /home/t/test/.authfile <span class="STRING">require</span> Alexey Kondr Fenix </td> </tr> </tbody> </table> </div> <br> <p>Так же как и с запретом доступа по IP здесь можно использовать расширение <strong><Files></strong> ниже приведены два примера: установки пароля на группу файлов и на один определенный файл. <br><br></p> <div> <table width="98%"> <tbody> <tr style="background-color: #82c9d8;"> <td align="left"> <<span class="STRING">Files</span> "<span class="KEYWORD">passwd.html</span>"> <span class="STRING"> AuthName</span> "<span class="KEYWORD">Protected area, need authorization</span>" <span class="STRING"> AuthType</span> Basic <span class="STRING"> AuthUserFile</span> /home/t/test/.authfile <span class="STRING"> require</span> valid-user </<span class="STRING">Files</span>> </td> </tr> </tbody> </table> </div> <br> <br> <div> <table width="98%"> <tbody> <tr> <td style="background-color: #82c9d8;" align="left"> <<span class="STRING">Files</span> "<span class="KEYWORD">.(key)$</span>"> <span class="STRING"> AuthName</span> "<span class="KEYWORD">Protected area, need authorization</span>" <span class="STRING"> AuthType</span> Basic <span class="STRING"> AuthUserFile</span> /home/t/test/.authfile <span class="STRING"> require</span> valid-user </<span class="STRING">Files</span>> </td> </tr> </tbody> </table> </div> <br> <p>Следует помнить, что при таком ограничении доступа пароли передаются по каналам связи в открытом виде и при определенных обстоятельствах могут быть перехвачены злоумышленниками. Поэтому в целях безопасности рекомендуется организовывать доступ к закрытым областям веб-сайта через защищенное <strong>SSL-соединение</strong>.<br> <br></p> <h3><a name="php"></a>Указание опций PHP</h3> <br> <p>Директивы для конфигурирования <strong>PHP</strong> можно размещать не только в файле <strong>php.ini</strong>, но также и в конфигурационных файлах <strong>Apache</strong> для вашего сайта – <strong>.htaccess</strong>. Это позволяет проводить тонкую настройку <strong>php</strong> для разных директорий.<br> <br> Для работы с <strong>PHP</strong> в конфигурационных файлах <strong>Apache</strong> доступны 4 директивы: <strong>php_value</strong>, <strong>php_flag</strong>, <strong>php_admin_value</strong>, <strong>php_admin_flag</strong>, которые отличаются значимостью, типом устанавливаемых значений и местом применения.<br> <br> Директивы <strong>php_admin_value</strong>, <strong>php_admin_flag</strong> выставляются только в файле httpd.conf, так что нам они не интересны. По сути данныхе директивы переопределяют значение остальных директив.<br> <br> Директивыа <strong>php_flag</strong> служит для установки логических значений директив в <strong>php.ini</strong>. В то время как директива <strong>php_value</strong> служит для установки строковых и числовых значений директив <strong>php.ini</strong>, т.е. любых типов значений, за исключением логических.<br> <br> Синтаксис директив очень прост: <br><br></p> <table width="98%"> <tbody> <tr> <td style="background-color: #82c9d8;" align="left"> <span class="STRING">php_flag </span> имя директивы <span class="KEYWORD">on</span> | <span class="KEYWORD">off</span> <span class="STRING">php_value </span> имя директивы <span class="KEYWORD">VALUE</span> </td> </tr> </tbody> </table> <p> </p> <p>Приведем перечень наиболее часто используемых директив<br><br></p> <table border="0"> <tbody> <tr style="background-color: #82c9d8;"> <td valign="top" width="180"> <h3>mysql.default_host</h3> </td> <td style="background-color: #dee26e;"> <p>Устанавливает имя хоста базы данныхх.<br> <strong>Пример:</strong> php_value mysql.default_host localhost <br><br></p> </td> </tr> <tr style="background-color: #82c9d8;"> <td valign="top"> <h3>mysql.default_user</h3> </td> <td style="background-color: #dee26e;"> <p>Устанавливает имя пользователя базы данныхх<br> <strong>Пример:</strong> php_value mysql.default_user alexey <br><br></p> </td> </tr> <tr style="background-color: #82c9d8;"> <td valign="top"> <h3>mysql.default_password</h3> </td> <td style="background-color: #dee26e;"> <p>Устанавливает пароль пользователя базы данныхх<br> <strong>Пример:</strong> php_value mysql.default_password Hry5Gw2 <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;" valign="top"> <h3>display_errors</h3> </td> <td style="background-color: #dee26e;"> <p>Разрешает вывод ошибок и предупреждений в браузер.<br> <strong>Пример:</strong> php_flag display_errors 0 <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;" valign="top"> <h3>display_startup_errors</h3> </td> <td style="background-color: #dee26e;"> <p>Включает отображение ошибок, возникающих при запуске PHP.<br> <strong>Пример:</strong> php_flag display_startup_errors 0 <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;" valign="top"> <h3>error_reporting</h3> </td> <td style="background-color: #dee26e;"> <p>Определяет типы (уровени важности) фиксируемых ошибок.<br> <strong>Пример:</strong> php_value error_reporting “E_ALL & ~E_NOTICE” <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;" valign="top"> <h3>auto_prepend_file</h3> </td> <td style="background-color: #dee26e;"> <p>Определение файла, который будет выводится в начале каждого php-скрипта. Путь указывается от корня файловой системы сервера. <br> <strong>Пример:</strong> php_value auto_prepend_file /www/server/prepend.php <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;" valign="top"> <h3>auto_append_file</h3> </td> <td style="background-color: #dee26e;"> <p>Определение файла, который будет выводится в конце каждого php-скрипта.<br> <strong>Пример:</strong> php_value auto_append_file /www/server/append.php <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;" valign="top"> <h3>sendmail_from</h3> </td> <td style="background-color: #dee26e;"> <p>Устанавливает e-mail отправителя, который применяется при отправке почтовых сообщений с помощью PHP.<br> <strong>Пример:</strong> php_value sendmail_from root@dvigov.com <br><br></p> </td> </tr> <tr> <td style="background-color: #82c9d8;" valign="top"> <h3>user_agent</h3> </td> <td style="background-color: #dee26e;"> <p>Устанавливает строку User-agent, которая используется PHP при обращении к удаленным серверам.<br> <strong>Пример:</strong> php_value user_agent “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)” <br><br></p> </td> </tr> </tbody> </table> <p> </p> <p>Например для вывода всех сообщений об ошибках генерируемых <strong>php</strong> в <strong>.htaccess</strong> нужно прописать следующие строки:<br> <br></p> <table width="98%"> <tbody> <tr style="background-color: #95cfcd;"> <td align="left"> <span class="STRING">php_flag </span> display_errors <span class="KEYWORD">1</span> <span class="STRING">php_flag </span> display_startup_errors <span class="KEYWORD">1</span> <span class="STRING">php_value </span> error_reporting “<span class="KEYWORD">E_ALL & ~E_NOTICE</span>”
</td> </tr> </tbody> </table> <p> </p> <p>Для запрещения выполнения <strong>php</strong> в текущей директории и во всех вложенных необходиомо в <strong>.htaccess</strong> прописать следующие строки:<br> <br></p> <table width="98%"> <tbody> <tr style="background-color: #b1d9dc;"> <td align="left"> <span class="STRING">php_flag engine </span> <span class="KEYWORD">off</span> </td> </tr> </tbody> </table></div> </div><br> <div class="quote">Ключевые теги: [search]htaccess[/search], [search]изучение[/search], [search]сервер[/search], [search]редирект[/search][/html]
|