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

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


htaccess

Различия

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

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

htaccess [2018/11/20 13:30] (текущий)
Строка 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]]). ​
 +
  
htaccess.txt · Последние изменения: 2018/11/20 13:30 (внешнее изменение)