Инструменты пользователя

Инструменты сайта


htaccess

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

htaccess [2018/11/20 21:30]
htaccess [2020/06/13 13:45] (текущий)
Строка 1: Строка 1:
 +====== .htaccess ======
 +{{ :htaccess-01.jpg |}}
 +~~Title: Настройка .htaccess ~~
 +{{htmlmetatags>
 +metatag-description=(Файл .htaccess – это локальный конфигурационный файл вебсервера Apache, который перечитывается при каждом запросе пользователя сайта.)
 +}}
 +
 +  * htpasswd - генерация пароля на доступ к определенным страницам или разделам вашего сайта.
 +  * [[mod_rewrite]] - синтаксический анализатор (использующий регулярные выражения) выполняющий [[URL]] преобразования на лету.
 +  * [[URL redirection]] (перенаправление URL)
 +  * [[Работа с директивами PHP.ini в httpd.conf]]
 +  * [[http://httpd.apache.org/docs/trunk/howto/htaccess.html|Apache HTTP Server Tutorial: .htaccess files]]
 +  * [[http://www.egoroff.spb.ru/portfolio/apache/rewriteguide.html|Руководство по URL преобразованиям]] - Перевод Apache URL Rewriting Guide в оригинале написанного Ralf S. Engelschall. Этот документ дополняет документацию к mod_rewrite. Он описывает возможности использования mod_rewrite веб-сервера Apache.
 +  * [[http://www.htaccess.net.ru]] Настройка веб сервера Apache через .htaccess
 +  * [[http://www.beget.ru/art9|Волшебный файл .htaccess]]
 +  * [[http://www.htaccess.net.ru/doc/Apache/server_name.php|Переменные окружения веб-сервера Apache]]: REMOTE_ADDR, REQUEST_FILENAME и т.д.
 +
 +
 +**.htaccess** (с точкой в начале имени) – файл, который дает возможность конфигурировать работу сервера, не предоставляя доступа к главному конфигурационному файлу, в отдельных директориях . Например, установить права доступа к файлам в директории, изменять названия индексных файлов, обрабатывать самостоятельно ошибки Apache, перенаправляя посетителей на специальные страницы ошибок. Конфигурационные директивы сервера Apache размещены в файлe httpd.conf. Но у Вас не всегда будут права доступа к этому файлу. Если вы используете для хостинга виртуальный сервер, когда один сервер Apache обслуживает множество сайтов, то вам не позволят менять его конфигурацию. Тем не менее, вы можете конфигурировать работу сервера в своих директориях. Делать это можно с помощью файлов .htaccess. Файл .htaccess может размещаться в любом каталоге. Директивы его действуют на все файлы в текущем каталоге и во всех его подкаталогах (если эти директивы не переопределены директивами нижележащих файлов .htaccess). Изменения, в файле .htaccess, вступают в силу сразу и не требуют перезагрузки сервера, как от изменений, вносимых в главный конфигурационный файл httpd.conf.
 +
 +<note tip>Для того, что бы файлы .htaccess можно было использовать — необходимо настроить директиву [[AllowOverride]] в конфигурации Apache. Чтобы дать директивам файлов .htaccess максимальные права нужно прописать в httpd.conf: **AllowOverride All**.</note>
 +
 +===== Примеры использования .htaccess =====
 +  * Запретить доступ для всех ко всем файлам и директориям. Правила распространяются как на текущую так и на вложенные папки<code>
 +Order Deny,Allow
 +Deny from all
 +</code>Разрешить доступ с определенного IP-адреса<code>
 +Order Deny,Allow
 +Deny from all
 +Allow from 195.135.232.70
 +Allow from .example.com
 +</code>Строка order deny,allow определяет, порядок выполнения директивы. Вначале выполняется директива запрета доступа, затем разрешается доступ для IP- адреса 195.135.232.70. Если в первой строке поменять порядок следования директив на order Allow,Deny, то доступ для данного IP-адреса не будет открыть, так как директива deny, выполняемая последней перекроет действия директивы allow.
 +
 +  * Изменение названия индексной страницы:<code>DirectoryIndex index.html index.php index.shtml</code>Указать можно несколько индексных страниц. При запросе каталога они будут искаться в том порядке, в котором перечислены в директиве DirectoryIndex. Если не будет найден файл index.html, будет произведен поиск файла index.php и т.д.
 +  * Выполнять код PHP в файлах HTML<code>
 +RemoveHandler .html .htm
 +AddType application/x-httpd-php .php .htm .html .phtml
 +AddHandler application/x-httpd-php .css
 +</code>Добавив эти строки в .htaccess вы дадите директиву серверу выполнять инструкции PHP не только в файлах с расширением *.php и *.phtml, но и в файлах с расширением *.htm и *.html.
 +  * Выполнять код PHP в файлах [[CSS]]<code>
 +AddHandler application/x-httpd-php .css
 +</code>
 +  * Переопределение обработчиков для [[PHP]] и Perl. То есть в директории с этими настройкам все файлы будут восприниматься как текстовые.<file>
 +RemoveHandler .php .phtml .pl
 +AddType text/plain .php .phtml .pl
 +</file>
 +  * Обработка ошибок Apache<code>
 +ErrorDocument 401 /401.html
 +ErrorDocument 403 /403.html
 +ErrorDocument 404 /404.html
 +ErrorDocument 500 /500.html</code>При возникновении этих ошибок посетитель будет перенаправлен на специально созданные страницы.<code>
 +     401 ошибка — Требуется авторизация (Authorization Required).
 +     403 ошибка — пользователь не прошел аутентификацию, доступ запрещен (Forbided).
 +     404 ошибка — Документ не найден (Not Found).
 +     500 ошибка — Внутренняя ошибка сервера (Internal Server Error).</code>
 +  * Запрет на отображение содержимого каталога при отсутствии индексного файла(например, index.html)<code>Options -Indexes - запрещает отображение.
 +Options Indexes или Options +Indexes - разрешает.</code>
 +  * Определение кодировки (utf-8, windows-1251), в которой сервер "отдает" файлы<file>
 +AddDefaultCharset utf-8
 +
 +</file>
 +  * Определение кодировки на загружаемые файлы<code>CharsetSourceEnc windows-1251</code>
 +  * [[http://php.net/manual/ru/security.magicquotes.disabling.php|Отключение волшебных кавычек]].<file>
 +php_flag magic_quotes_gpc Off
 +</file>
 +
 +===== HOWTO: .htaccess + mod_rewrite =====
 +Оригинал: [[http://www.drupal.ru/node/2643|HOWTO: .htaccess + mod_rewrite + RewriteCond + RewriteRule + regex]]
 +
 +Поясню пример:<file>
 +RewriteRule [^/.]/feed urllist.txt
 +</file>мы имеем регулярное выражение в левой части: [^/.]/feed и выражение замены url в правой: urllist.txt В квадратных скобках стоит character set, т.е. набор символов.
 +Набор (сам по себе) обозначает один единственный символ.
 +Символы внутри набора задают правило, которому должен соответствовать символ. Крышка, поставленная вначале набора означает, что набор соответствует любому символу, кроме перечисленных в наборе после крышки.
 +Т.е., в данном примере, это любой символ кроме слэша или точки.
 +Следовательно перенаправление на urllist.txt будет всякий раз когда на конце встречается /feed, за исключением двух случаев:
 +когда на конце <file>
 +//feed (например http://feed)
 +</file>
 +и когда на конце <file>
 +./feed (например ../feed)
 +</file> 
 +==== Drupal RewriteRule ====
 +Рассмотрим стандартное RewriteRule СМС [[Drupal]].
 +<file>
 +<IfModule mod_rewrite.c># если включен mod_rewrite
 +  RewriteEngine on      # включить движок Rewrite
 +  RewriteCond %{REQUEST_FILENAME} !-f # применять RewriteRule, только если
 +  #запрашиваемое имя файла не совпадает с именем какого-нибудь реального файла на сервере
 +  RewriteCond %{REQUEST_FILENAME} !-d # и не совпадает с именем какой-нибудь реальной директории
 +  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] # это правило рассмотрим подробнее ниже
 +</IfModule>
 +</file>
 +Левая часть: ^(.*)$
 +Крышка вначале означает начало строки.
 +Бакс в конце означает конец строки.
 +Точка в скобочках означает любой символ.
 +Звездочка после точки означает, что любых символов может быть от нуля до бесконечности.
 +Скобочки означают группу. Т.к. она первая (и единственная), то эта группа идет под номером 1. Правая часть: index.php?q=$1
 +означает, что мы перезаписываем url на index.php?q= и к этому добавляем первую группу $1, т.е. имя запрашиваемого файла. Немного о точках и крышках.
 +В первом примере точка обозначала точку, потому что она была внутри набора символов.
 +Во втором примере точка обозначала любой символ, потому что она была вне набора символов.
 +В первом примере крышка играла роль оператора исключения.
 +Во втором примере крышка обозначала начало строки. 
 +
 +Флаги [L,QSA] http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html:
 +  * 'last|L' (последнее правило). Остановить процесс преобразования на этом месте и не применять больше никаких правил преобразований. Это соответствует оператору last в Perl или оператору break в  языке C. Используйте этот флаг для того, чтобы не преобразовывать текущий URL другими, следующими за этим, правилами преобразований.
 +  * 'qsappend|QSA' (query string append - добавлять строку запроса). Приплюсовать то, что идет после знака вопроса. Например, если урла была такая, http://mysite.com/node/1?size=_original, то в браузере останется такой-же, но скрипту пойдет в таком виде: http://mysite.com/index.php?q=/node/1?size=_original
 +====== ЧПУ, шаблон MVC  ======
 +Шаблон проектирования [[MVC]](Model-View-Controller) требует единой точки входа для всех запросов, т. е. все запросы должны начинать обрабатываться одним файлом, например index.php.<file>
 +
 +# Кодировка сайта:
 +AddDefaultCharset UTF-8
 +
 +# Запрет на отображение содержимого каталога при отсутствии индексного файла(например, index.html)
 +#Options -Indexes
 +
 +# Правило для url
 +# Включаем модуль RewriteEngine для создания единой точки входа
 +RewriteEngine On
 +
 +# Правила для шаблон MVC
 +# Чтобы не обрабатывать файлом index.php графические файлы, css. 
 +# js файлы, а позволять их скачивать браузеру на прямую
 +RewriteCond %{REQUEST_FILENAME} !-f
 +RewriteCond %{REQUEST_FILENAME} !-d
 +
 +# Перенаправлять все запросы на index.php
 +RewriteRule $ index.php [nocase,last]
 +</file>
 +
 +====== htpasswd ======
 +<code>
 +> man htpasswd
 +NAME
 +       htpasswd - Manage user files for basic authentication
 +SYNOPSIS
 +       htpasswd [ -c ] [ -m ] [ -D ] passwdfile username
 +       htpasswd  -b  [  -c  ] [ -m | -d | -p | -s ] [ -D ] passwdfile username
 +       password
 +       htpasswd -n [ -m | -d | -s | -p ] username
 +       htpasswd -nb [ -m | -d | -s | -p ] username password
 +
 +...
 +</code>
 +[[.htaccess]] можно использовать и для установки пароля на доступ к определенным страницам или разделам вашего сайта. Делается это путем создания в нужном подкаталоге файла .htaccess, в который пишется следующее:
 +<code>
 +AuthType Basic
 +AuthName "this is a test of protected realm"
 +AuthUserFile /path/to/file/with/passwords
 +<Limit GET POST>
 +require valid-user
 +</Limit>
 +</code>
 +Кроме того, нужно создать файл с паролями, путь к которому указывается в качестве параметра к директиве AuthUserFile. Пароли в этом файле должны быть шифрованными, чего можно достигнуть с помощью программы htpasswd, входящей в поставку Apache.
 +
 +Итак, изначально у нас еще нет файла с паролями и нам нужно его создать :
 +<file>
 +> htpasswd -c passwords test1
 +New password:
 +Re-type new password:
 +Adding password for user test1
 +>
 +</file>
 +После выполнения данной операции htpasswd создаст файл passwords, в котором окажется пользователь test1 и его пароль в зашифрованном виде:
 +<file>
 +> cat passwords
 +test1:zgco1KREjBY8M
 +>
 +</file>
 +А теперь мы хотим добавить еще одного пользователя. Так как файл с паролями у нас уже есть, мы просто не будем использовать ключ '-c' :
 +<file>
 +> htpasswd passwords test2
 +New password:
 +Re-type new password:
 +Adding password for user test2
 +
 +> cat passwords
 +test1:zgco1KREjBY8M
 +test2:eN3uA6t0kzV1c
 +>
 +</file>
 +Сейчас попробуйте обратиться к тому каталогу, в котором мы размещали .htaccess – браузер спросит у вас пароль, чего мы и добивались. Пока не будет введен правильный логин и пароль, посетитель не увидит соответствующей страницы.
 +
 +В качестве параметра к директиве require мы указали valid-user. Это означает, что любой пользователь, который есть в используемом файле с паролями, может иметь доступ к защищенному ресурсу. Однако, согласитесь, удобно иметь все пароли в одном файле, а права на конкретные ресурсы давать только определенным пользователям. Это тоже реализуемо. Например, мы хотим дать доступ только пользователю test2. Делаем так :
 +require user test2
 +Еще можно объединить пользователей в группы и давать доступ не конкретным логинам, а группам. Это можно сделать с помощью директивы AuthGroupFile:
 +AuthGroupFile /path/to/file/with/groups
 +В файле /path/to/file/with/groups создаем группы примерно так :
 +<file>
 +group1: test1 test5
 +group2: test2 test4
 +group3: test1 test3
 +</file>
 +Соответственно, директиву require будем использовать так: require group group3
 +Механизмы ограничения доступа, которые реализованы в Apache, позволяют очень гибко управлять правами для пользователей и групп, что является очень важной возможностью. Если углубиться в изучение предмета, Вы сможете узнать и то, что логины и пароли, используемые для авторизации, можно хранить не только в файлах, но и в простейших базах данных формата BerkeleyDB - почитайте документацию по директиве AuthDBGroupFile. Также для хранения данных авторизации можно использовать практически любую СУБД ([[MySQL]] или [[PostgreSQL]]). 
 +