Содержание

Настройка файла htaccess | Losst

Сейчас для организации работы подавляющего большинства сайтов в сети используется веб-сервер Apache. Он немного отстает в производительности, но зато очень прост в настройке и имеет огромное количество возможностей.

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

Настройка файла htaccess очень похожа на настройку главного файла конфигурации Apache. Но она немного отличается. С помощью этого файла вы можете настроить редиректы, внутреннее изменение url, права доступа, авторизацию по паролю и многое другое. В сегодняшней статье мы рассмотрим как правильно настроить htaccess для вашего сервера.

Содержание статьи:

Синтаксис файла htaccess

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

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

<Directory адрес_папки_htaccess>. Это не позволяет менять глобальные настройки, но вы можете очень тонко настроить поведение программы в папках, к которым у вас есть права доступа.

Общий синтаксис директив очень прост, это пары команд и их опций, разделенных пробелом, например:

Команда параметр1 параметр2 флаги

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

Настройка доступа htaccess

Довольно часто htaccess используется для управления доступом к папке. Для управления доступом используются три команды:

  • order — порядок;
  • deny — запретить;
  • allow — разрешить.

Сначала, с помощью опции order, нужно указать в каком порядке будут выполняться директивы, значение имеет только эта команда, и неважно в какой последовательности они расположены в файле.

Затем с помощью директивы allow или deny мы разрешаем или запрещаем доступ к папке с определенных адресов. Например, чтобы запретить все необходимо добавить в htaccess:

Order deny,allow
Deny from all

Но мы также можем разрешить доступ только с локальной сети:

Order deny,allow
Deny from all
Allow 192.168.0.

Если указано deny,allow, то проверка будет выполняться в таком порядке. Сначала все директивы deny, затем все директивы allow, и если ни одно из условий не подошло, то запрос пропускается.При allow,deny такой запрос будет по умолчанию отклонен. Например, предыдущий пример можно написать так:

Order allow,deny
Allow 192.168.0.

Модификация URL в htaccess

Наиболее часто htaccess используется для модификации URL во время выполнения или редиректов. За эту функциональность отвечает модуль mod_rewrite и обычно он активирован в большинстве конфигураций Apache.

Модификация URL в htacces выполняется с помощью трех директив, это RewriteBase, которая указывает префикс адреса, RewriteCond проверяет соответствие, и RewriteRule — изменяет URL в соответствии с регулярным выражением если все правила соответствия подходят.

Сначала нужно включить Mod_Rewrite, на случай если модуль еще не активен:

RewriteEngine on

Укажем, что в качестве префикса для URL нужно использовать корень:

RewriteBase /

И будем автоматически заменять URL адреса с index.html на index.php, обратите внимание, что исходный URL — это путь к запрашиваемому файлу относительно расположения файла htaccess:

RewriteRule index.html /index.php

Для более эффективной замены можно использовать регулярные выражения они состоят из специальных символов и переменных и обычных символов и цифр. Рассмотрим основные специальные символы:

  • ^ — начало строки;
  • $ — конец строки;
  • . — любой символ;
  • * — любое количество любых символов;
  • ? — один определенный символ;
  • [0-9] — последовательность символов, например, от 0 до 9;
  • | — символ или, выбирается или одна группа, или другая;
  • () — иcпользуется для выбора групп символов.

В регулярных выражениях htaccess также можно использовать переменные с данными, полученными из заголовков запроса, например:

  • %{HTTP_USER_AGENT} — поле User-Agent, которое передает браузер пользователя;
  • %{REMOTE_ADDR} — IP адрес пользователя;
  • %{REQUEST_URI} — запрашиваемый URI;
  • %{QUERY_STRING} — параметры запроса после знака ?.

Это наиболее часто используемые переменные, но их есть намного больше, остальные вы можете найти в официальной документации. Регулярные выражения открывают более широкие возможности, например, вы можете заменять во всех страницах html на php:

RewriteEngine On;
RewriteBase /;
RewriteRule ^(.*)\.html$ $1.php

Директива RewriteCond дает еще больше гибкости, вы можете выбрать к каким адресам стоит применять модификацию, например, будем переопределять данные только для версии с www:

RewriteBase /;
RewriteCond % {HTTP_HOST} ^www.site.ru$
RewriteRule ^(.*)\.html$ $1.php

Таким образом, вы можете выполнять любые преобразования ваших URL без фактических редиректов куда-либо. Но дальше мы рассмотрим как делать редиректы.

Настройка редиректов в htaccess

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

Самый простой редирект можно выполнить без mod_rewrite, с помощью такой строки:

Redirect 301 /index.html http://www.site.ru/index.php

Но обычно нужны перенаправления с более широким действием. Все выглядит очень похоже, только теперь мы используем флаг [NC] чтобы не учитывать регистр, [L] для прекращения обработки и [R] — для редиректа. Например, перенаправление htaccess с версии без www на домен с www:

RewriteCond %{HTTP_HOST} ^site\.ru$ [NC]
RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]

Значение R=301 означает код редиректа, который будет возвращен клиенту, можно использовать 301, 302 и т д. Редирект htaccess с домена www на домен без префикса будет выглядеть так:

RewriteCond %{HTTP_HOST} ^www.site\.ru$ [NC]
RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]

Таким же образом можно сделать переадресацию:

RewriteRule ^старый_адрес /новый_адрес/$1 [R=301,L]

Редирект с http версии на https:

RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTP} =on
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

Настройка страниц ошибок в htaccess

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

Настройка htaccess для этого пункта будет очень полезной. Вы можете использовать директиву ErrorDocument. С помощью нее можно задать html страницы для ошибок 4хх и 5хх. Например, для 404:

ErrorDocument 404 http://site.ru/error/404.shtml
ErrorDocument 403 http://site.ru/error/403.shtml
ErrorDocument 401 http://site.ru/error/401.shtml
ErrorDocument 500 http://site.ru/error/500.shtml

Кэширование в htaccess

Браузер позволяет хранить в своем кэше изображения, файлы скриптов, стилей и другие медиафайлы определенное время. Время жизни кэша задается веб-сервером с помощью специальных заголовков. Их можно настроить с помощью модуля expires.

Сначала активируем модуль и устанавливаем период кэширования по умолчанию:

ExpiresActive On
ExpiresDefault "access plus 1 month"

Теперь мы можем настроить кэширование для каждого mime типа файлов:

ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "access plus 5 hours 3 minutes"
ExpiresByType image/x-icon "access plus 2592000 seconds"

В первой строке мы указываем, что страницы html нужно считать годными на один месяц 15 дней и два часа с момента загрузки. Доступны такие типы файлов:

  • image/x-icon;
  • image/jpeg;
  • image/png;
  • image/gif;
  • application/x-shockwave-flash;
  • text/css;
  • text/javascript;
  • application/javascript;
  • application/x-javascript;
  • text/html;
  • application/xhtml+xml;

Чтобы быть уверенным что эта конструкция не вызовет ошибок заключите ее в if:

<ifModule mod_expires.c>
</ifModule>

Сжатие файлов в htaccess

Для сжатия в Apache можно использовать модуль deflate. Здесь достаточно просто перечислить mime типы файлов, которые нужно сжать. Например:

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript

Вы также можете заключить конструкцию if, чтобы проверить поддерживается ли этот модуль:

<ifModule mod_deflate.c>
</ifModule>

Выводы

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

На завершение предлагаю видео с обзором конфигурационного файла Apache:

losst.ru

Попытка номер раз создать почти идеальный htaccess / Habr

    - Google выше ранжирует сайты, которые загружаются быстрее.
    - Если на eBay или Amazone увеличить время загрузки страниц на 9% они теряют 1% прибыли.
    - Сделать свой сайт быстрее, чтобы сэкономить на клиентском трафике и на числе обращений к серверу.

.htaccess — наш герой


Профессионалы знают, что такое htaccess.
Тем кто собираются уйти с народ.ру на php-хостинг только предстоит узнать, что это такое.
Те кто только что установил свои первые jooml’у или wordpress срочно должны узнать о нашем герое — htaccess

Зачем нам .htaccess ?


Представьте, что вы купили себе хостинг и кажется, почти обрели счастье. Но однажды (а может быть дважды, а может и трижды) ваш сайт перестает отвечать на запросы. Начинает медленно грузиться и вообще вести себя странно. А виртуальный хостинг это такая хитрая штука, что помимо вашего сайта на этом сервере находится ещё два десятка других сайтов. Все они разные по мощности, организованности и трафику. И когда ваш сосед по случайности, а может и умыслу запускает на своем хостинге сложные или избыточные в алгоритмах скрипты, это отзывается и на вас.

Или другой пример. Скажем ваш ресурс начинает набирать популярность, но переезжать на выделенный сервер ещё рано, а мощностей VPS уже не хватает. Вас очень может выручить htaccess.

А ещё htaccess может решить некоторые вопросы с безопасностью вашего сайта.

А ещё…


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

1. Первой строкой задаем основные опции:

Options All -ExecCGI -Indexes -Includes +FollowSymLinks

Использовать опции очень удобно, когда у вас нет доступа к конфигурированию Апача или нужны разные настройки Апача для разных сайтов на одном сервере.

Опция -ExecCGI запрещает запуск CGI скриптов. Лучше разрешить только для конкретных папок. Повысит безопасность.
Опция -Indexes запрещает показывать содержимое каталогов, если в них нет индексного файла. На виртуальном хостинге обычно включена по умолчанию. Изменив минус на плюс +Indexes можете наоборот разрешить просмотр содержимого каталога (или каталогов).
Опция -Includes запрещает SSI. Если не знаете, что это — запрещайте (Можно поЯндексировать(

!) по запросу Server Side Include если хотите узнать об этом побольше). Можно использовать опцию IncludesNOEXEC, которая разрешит использовать SSI без запуска скриптов.
Опция +FollowSymLinks позволяет использовать символические ссылки на файлы или каталоги, не находящиеся в пределах корня вашего сайта.

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

Необязательно полностью перечислять все опции в дочерних .htaccess если они не изменяются. Достаточно указать (переназначить) только те опции и директивы, которые изменяются. Остальные опции также унаследуются от родителя.


ПримерСкажем, у вас есть вот такой путь /site/folder_one/subfolder/other/
В файле /site/.htaccess вы указываете:
Options  -Indexes
Allow from all

В файле /site/folder_one/.htaccess указываете:
Deny from all

В файле /site/folder_one/subfolder/.htaccess указываете:
Options  +Indexes
Allow from all

Получиться вот что:
В папке site будут показываться файлы любого содержания, если только к ним напрямую обратиться. Или индексный файл, если не явного обращения к одному из файлов. В случае отсутствия индексного файла получена 403 ошибка.
К папке folder_one доступ закрыт. Даже если знать имя файла и набрать его в адресной строке в ответ сервер вернет ошибку 403.
Папка subfolder разрешена для обращений по прямому адресу или же в случае отсутствия индексного файла покажет содержимое каталога. Эти же права распространяться и на папку other.
Если убрать файл ,htaccess из папки folder_one, то она унаследует права от родительской site.

2. Немного SEO (куда же без него)
<IfModule mod_rewrite.c>
	RewriteEngine on
	RewriteBase /
	RewriteCond %{HTTP_HOST} ^black-web
	RewriteRule (.*) http://www.black-web.ru/$1 [R=301,L]
	RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
	RewriteRule ^index\.php$ http://www.black-web.ru/ [R=301,L]
</IfModule>

Обязательно не забыть про условие . Не окажись у хостера данного модуля и ваш сайт станет выдавать 500-ую ошибку. Данный конкретный модуль входить в сборку Апача по-умолчанию. Ну а вдруг… Хостеры и их админы бывают всякие.

В данной части пользы больше для SEO. Модуль rewrite как следует из его названия занимается перенаправлениями (привет Кэпу).

В этой части файла мы указали две склейки: мы склеили ваш_сайт и www.ваш_сайт Даже если пользователь наберет ваш сайт без WWW его перебросить 301 редериктом на www.ваш_сайт.
А также мы избавились /index.php в строке запроса. Если пользователь наберет www.ваш_сайт/index.php его перебросит (снова 301 редериктом) на www.ваш_сайт.
Теперь поисковики не будут путаться между www и не будут дублировать главную страницу в результатах индексирования вашего сайта. Гуглим СЕО склейки домена, если не понимаете зачем это нужно.

3. Кто в папке главный?

Если у вас папке есть файлы index.html и index.php (не знаю, зачем и кому такое было нужно, но не раз видел такое) то как указать серверу кто их них более индексный?

DirectoryIndex index.php

А ещё можно там указать скажем roosso.php и тогда набрав в строке запроса адрес сайт.бла/бла/бла/ вы увидете не index, а roosso

4. Ещё настройки…

<IfModule mod_setenvif.c>
	SetEnv TZ Europe/Moscow
</IfModule>
ServerSignature Off
AddDefaultCharset UTF-8

Первая строчка устанавливает часовой пояс. Например в Apache 2.22.22 был баг связанный с этой опцией. Функции времени в php не работали, пока не установишь часовой пояс.

Вторая строка это подпись сервера. Вы их не раз видели на всяких системных страницах типа 500ой ошибки или 403ей. Обычно там какая-нибудь техническая информация и почта вебмастера. Я предпочитаю даже в таких мелочах скрывать данные о софте на сервере. Коллеги параноики меня поддержат.

Угадайте, что делает третья строка?

5. Когда нет доступа к php.ini

С помощью .htaccess мы также можем управлять рядом настроек PHP. На виртуальном хостинге, как правило, нет возможности изменять настройки php.ini. Чаще всего этого и не требуется. Но все же есть ряд опций контроль над которыми может нам быть полезен. Например, увеличить лимит на загрузку файлов, или лимит передачи данным методом POST.

<ifModule mod_php.c>
  php_value	upload_max_filesize	32M
  php_value	post_max_size		10M
  php_value	default_charset utf-8
  php_value	max_execution_time 200
</ifModule>

Первая строчка разрешить загружать файлы размером до 32 Мегабайт. По умолчанию в php обычно это значение 8 или 16 мегабайт.
Второй строкой разрешаем постинг объемом до 10 мегабайт. По умолчанию это значение обычно 2 Мегабайта.
Третья строка устанавливает кодировку по используемую вашими скриптами. По своей сути она дублирует строку: «AddDefaultCharset UTF-8». Но я чаще прибегаю к установке кодировки именно через php.
Четвертой строкой изменяем лимит времени выделенный на выполнение скрипта. По умолчанию он обычно равен 30 секундам. Но иногда для выполнения каких нибудь сложных обработок требуется больше времени.

6. Типы файлов. Ловкость рук и ни какого мошенничества.

В моей практике случалось пару раз, что после какого либо обновления провайдером софта, слетали типы файлов. Хотя такое редко. За 10 лет, всего два случая. Но иногда мне нужно было заставить html работать как php. А иногда требуется научить апач различать типы файлов, которые ему неизвестно. (Как оказалось Апачу вообще мало что известно из редких типов файлов.) В такой ситуации нас спасет следующий код:

AddHandler application/x-httpd-php .html
AddHandler cgi-script .pl .py .jsp .asp .htm .shtml .sh .cgi
AddType application/x-javascript .js
AddType text/css .css
AddType text/xml .xml
AddType application/octet-stream .doc .mov .avi .pdf .xls 
# ForceType application/x-httpd-php

Первая строчка позволит нашим php файлам иметь расширение html, но выполняться как php. Полезно бывает во многих случаях. А в старые добрые когда поисковики индексировали ЧПУ лучше, такая строчка всегда приходила на выручку.
Мы можем переназначить, добавить или подменить любые типы файлов под удобные нам разрешения.

Интересный трюкКстати, вы можете легко написать к примеру вот такую строку:
AddHandler application/x-httpd-php .i

Потом переименовать все ваши файлы, изменив расширение на .i (не забыв конечно про ссылки) и адреса файлов у вас на сайте будут не сайт.мой/index.php?uri а сайт.мой/index.i?uri

Например я пишу

AddHandler application/x-httpd-php .roosso

и создаю в корне своего сайта файл alex.roosso внутри обычный php код. Это вроде как страница обо мне любимом. И в адресной строке она будет выглядеть как www.black-web.ru/alex.roosso (ссылка рабочая, можете посмотреть что это так).
Второй строкой указано, какие расширения файлов должны выполняться как cgi скрипты.

Третья, четвертая и пятая строки, на всякий случай уточняют мим-тип файлов с разрешением css, js, xml. Не путайте с присвоением заголовка в ответе сервера на запрос, как это сделано в первых двух строках.

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

Седьмую строку я закомментировал. Это строчка в принудительно-добровольном порядке, будет все файлы с вашего сервера запустить как php. Её лучше использовать лишь в отдельных папках, при необходимости.

7. Знают взрослые и дети, что архивы меньше весят…

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

У Апача есть два модуля сжатия. Оба не являются модулями по умолчанию, поэтому необязательно могут присутствовать у вашего провайдера. Но как показала практика у 99% провайдеров один из них стоит. Наиболее распространен mod_deflate. Чтобы его с помощью сжимать весь контент на вашем сайте добавьте в .htaccess следующие строки:

<ifModule mod_deflate.c>
	AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
</ifModule>

Как видите мы должны перечислить mime type файлов, которые следует подвергать сжатию. Сюда можно добавить и видео и картинки, но толку это даст мало. Потому что jpeg или gif уже сами по себе являются сжатыми форматами. Также как avi или flv. Вы фактически нечего не выиграете указав их.

Второй менее популярный модуль это mod_gzip, Чтобы включить сжатие с его помощью добавьте вот такие строчки:

<IfModule mod_gzip.c>
	mod_gzip_on         Yes
	mod_gzip_dechunk    Yes
	mod_gzip_item_include file		\.(html?|txt|css|js|php|pl)$
	mod_gzip_item_include mime		^text\.*
	mod_gzip_item_include mime		^application/x-javascript.*
	mod_gzip_item_exclude mime		^image\.*
	mod_gzip_item_exclude rspheader	^Content-Encoding:.*gzip.*
</IfModule>

Данный модуль умеет работать с масками, что несомненно большой плюс. Да и синтаксис у него куда более гибкий чем у предыдущего. Но используют его реже. А по сжатию я даже не берусь судить, который из модулей лучше. Я сильной разницы не заметил при тестах.

8. А ещё быстрее можно?

Можно. Если применить кеширование страниц. У кеширования есть и плюсы и минусы, поэтому подходить к этому вопросу надо подготовившись. Для динамически обновляющегося сайт каждый 2-3 минуты, например популярного форума, нужно учесть, что пользователь должен видеть актуальную информацию. Но у любого сайт есть контент, который более или менее статичен. Например те же картинки, или файлы стилей. Поэтому нам потребуется по разному использовать кеширование различного содержимого на сайте. В html разметки мы всегда можем использовать meta теги. И через php мы может устанавливать заголовки ответа сервера. Остается вопрос, как быть с css, js, image и т.д. и т.п.

Помочь нам в этом могут два модуля: mod_headers и mod_expires которые могут установить заголовки в ответ сервера и подсказать вашему браузеру, что и как нужно кешировать. Один из модулей обычно стоит у провайдера, но как и в случае с любым модулем, который не входит в стандартную сборку Апача, 100% гарантии никто вам не даст. Поэтому снова во избежание 500й ошибки указывает условия для каждого из модулей.

<ifModule mod_headers.c>
	#кэшировать html и htm файлы на один день
	<FilesMatch "\.(html|htm)$">
		Header set Cache-Control "max-age=43200"
	</FilesMatch>
	#кэшировать css, javascript и текстовые файлы на одну неделю
	<FilesMatch "\.(js|css|txt)$">
		Header set Cache-Control "max-age=604800"
	</FilesMatch>
	#кэшировать флэш и изображения на месяц
	<FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
		Header set Cache-Control "max-age=2592000"
	</FilesMatch>
	#отключить кэширование
	<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
		Header unset Cache-Control
	</FilesMatch>
</IfModule>

Вот такой синтаксис у mod_headers. Думаю по комментариям ясно что к чему.
В данной секции я отключил кеширование php файлов. Хотя по моему мнению небольшой временной интервал кеширования им не повредит. 5-30 секунд, это интервал времени, за который мало что меняется. А многие пользователи любят пользоваться клавишей back (вернуться назад). Чтобы не загружать им страницу второй раз, а подхватить её из кеша, разумный интервал кеширования все же уместен.

Во второй секции где идут условия для mod_expires я именно так и делаю — для php ставлю небольшой интервал кеширования.

<ifModule mod_expires.c>
	ExpiresActive On
	#по умолчанию кеш в 5 секунд
	ExpiresDefault "access plus 5 seconds"
	#кэшировать флэш и изображения на месяц
	ExpiresByType image/x-icon "access plus 2592000 seconds"
	ExpiresByType image/jpeg "access plus 2592000 seconds"
	ExpiresByType image/png "access plus 2592000 seconds"
	ExpiresByType image/gif "access plus 2592000 seconds"
	ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
	#кэшировать css, javascript и текстовые файлы на одну неделю
	ExpiresByType text/css "access plus 604800 seconds"
	ExpiresByType text/javascript "access plus 604800 seconds"
	ExpiresByType application/javascript "access plus 604800 seconds"
	ExpiresByType application/x-javascript "access plus 604800 seconds"
	#кэшировать html и htm файлы на один день
	ExpiresByType text/html "access plus 43200 seconds"
	#кэшировать xml файлы на десять минут
	ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>

9. Правила вежливого тона…

В процессе модернизации своего сайта, мы часто оставляем хвосты ввиде ссылок, которые ведут на страницы, которые мы удалили. Иногда такие ссылки идут с других сайтов или из поисковых систем. Чтобы не терять пользователей вежливым тоном считается иметь собственные страницы для различного типа ошибок. Включая даже ошибки сервера. Например стандартное сообщение о 500й ошибки очень скучное и мрачное, и вряд ли вызовет у пользователя желание посетить вашу страницу ещё раз. Но в htaccess есть приемы, которые могут сделать даже эту страницу приветливей.

# Bad Rquest
ErrorDocument 400 /400.html
# Authorization Required
ErrorDocument 401 /401.html
# Forbidden
ErrorDocument 403 /403.html
# Not found
ErrorDocument 404 /404.html
# Method Not Allowed
ErrorDocument 405 /405.html
# Request Timed Out
ErrorDocument 408 /408.html
# Request URI Too Long
ErrorDocument 414 /414.html
# Internal Server Error
ErrorDocument 500 /500.html
# Not Implemented
ErrorDocument 501 /501.html
# Bad Gateway 
ErrorDocument 502 /502.html
# Service Unavailable 
ErrorDocument 503 /503.html
# Gateway Timeout
ErrorDocument 504 /504.html

Для 400-х ошибок можно использовать и динамические страницы на php. А вот для 500 лучше сделать на html и js. Это часть ошибок обычно связана с ошибками сервера (в большинстве случаев) и php или cgi как правило в такой ситуации не работают.

Если вам лень делать столько страниц устанавливайте страницей ошибок главную страницу своего сайта или карту сайта.

Все это вы делаете исключительно для людей. Поисковым роботам плевать на то есть у вас страницы ошибок или нет. Они видят ответ сервера с кодом ошибки и блокируют вашу страницу в поиск. Так что имейте ввиду, это не панацея. Это лишь вежливость к вашей аудитории и имидж вашего сайта.

10. Подведем итог

Знатоки понимают, что в этой статье описано далеко не все. Я коснулся здесь лишь поверхности «айсберга». На самом деле возможности .htaccess куда много обширней, чем описано в статье. Но я и не преследовал целью перевести манаул по htaccess на русский язык. Всего чего я хотел это создать небольшой костяк файла .htaccess для тех, кто только приступил к изучению данного вопроса, чтобы сэкономить их время на поисках информации по сети.

В результате всех манипуляций у нас должен был получить файл следующего содержания:

Options All -ExecCGI -Indexes -Includes +FollowSymLinks

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{HTTP_HOST} ^black-web
    RewriteRule (.*) http://www.black-web.ru/$1 [R=301,L]
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    RewriteRule ^index\.php$ http://www.black-web.ru/ [R=301,L]
</IfModule>

DirectoryIndex index.php

<IfModule mod_setenvif.c>
	SetEnv TZ Europe/Moscow
</IfModule>
ServerSignature Off
#AddDefaultCharset UTF-8
<ifModule mod_php.c>
	php_value	upload_max_filesize	32M
	php_value	post_max_size		10M
	php_value	default_charset utf-8
	php_value	max_execution_time 200
</ifModule>
AddHandler application/x-httpd-php .html
AddHandler cgi-script .pl .py .jsp .asp .htm .shtml .sh .cgi
AddType application/x-javascript .js
AddType text/css .css
AddType text/xml .xml
AddType application/octet-stream .doc .mov .avi .pdf .xls 
# ForceType application/x-httpd-php

<ifModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
</ifModule>

<IfModule mod_gzip.c>
    mod_gzip_on         Yes
    mod_gzip_dechunk    Yes
    mod_gzip_item_include file		\.(html?|txt|css|js|php|pl)$
    mod_gzip_item_include mime		^text\.*
    mod_gzip_item_include mime		^application/x-javascript.*
    mod_gzip_item_exclude mime		^image\.*
    mod_gzip_item_exclude rspheader	^Content-Encoding:.*gzip.*
</IfModule>

<ifModule mod_headers.c>
    #кэшировать html и htm файлы на один день
    <FilesMatch "\.(html|htm)$">
        Header set Cache-Control "max-age=43200"
    </FilesMatch>
    #кэшировать css, javascript и текстовые файлы на одну неделю
    <FilesMatch "\.(js|css|txt)$">
        Header set Cache-Control "max-age=604800"
    </FilesMatch>
    #кэшировать флэш и изображения на месяц
    <FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
        Header set Cache-Control "max-age=2592000"
    </FilesMatch>
    #отключить кэширование
    <FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
        Header unset Cache-Control
    </FilesMatch>
</IfModule>

<ifModule mod_expires.c>
    ExpiresActive On
    #по умолчанию кеш в 5 секунд
    ExpiresDefault "access plus 5 seconds"
    #кэшировать флэш и изображения на месяц
    ExpiresByType image/x-icon "access plus 2592000 seconds"
    ExpiresByType image/jpeg "access plus 2592000 seconds"
    ExpiresByType image/png "access plus 2592000 seconds"
    ExpiresByType image/gif "access plus 2592000 seconds"
    ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
    #кэшировать css, javascript и текстовые файлы на одну неделю
    ExpiresByType text/css "access plus 604800 seconds"
    ExpiresByType text/javascript "access plus 604800 seconds"
    ExpiresByType application/javascript "access plus 604800 seconds"
    ExpiresByType application/x-javascript "access plus 604800 seconds"
    #кэшировать html и htm файлы на один день
    ExpiresByType text/html "access plus 43200 seconds"
    #кэшировать xml файлы на десять минут
    ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>

# Bad Rquest
ErrorDocument 400 /400.html
# Authorization Required
ErrorDocument 401 /401.html
# Forbidden
ErrorDocument 403 /403.html
# Not found
ErrorDocument 404 /404.html
# Method Not Allowed
ErrorDocument 405 /405.html
# Request Timed Out
ErrorDocument 408 /408.html
# Request URI Too Long
ErrorDocument 414 /414.html
# Internal Server Error
ErrorDocument 500 /500.html
# Not Implemented
ErrorDocument 501 /501.html
# Bad Gateway 
ErrorDocument 502 /502.html
# Service Unavailable 
ErrorDocument 503 /503.html
# Gateway Timeout
ErrorDocument 504 /504.html

11. Послесловие.

Я старался не спешить в написании статьи и на это ушли почти сутки. Но все же где то я мог допустить ошибки в орфографии или пунктуации. Прошу не казнить, а миловать. А лучше писать в личку, чтобы я поправил ошибки.

И напоследок для любителей экспериментов несколько строк .htaccess. Сужу по своему опыту — на практике знания усваиваются лучше чем в теории.

Разные интересные примеры
# SECURE ____________________
<IfModule mod_ssl.c>
	SSLOptions +StrictRequire
	SSLRequireSSL
	SSLRequire %{HTTP_HOST} eq "black-web.ru"
</IfModule>
<IfModule mod_rewrite.c>
	RewriteCond %{HTTPS} !on
	RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</IfModule>

# HOTLINKING ________________
<IfModule mod_rewrite.c>
	RewriteCond %{HTTP_REFERER} !^$
	RewriteCond %{HTTP_REFERER} !^http://([ -a-z0-9]  \.)?black-web\.ru [NC]
	RewriteRule \.(gif|jpe?g|png)$ - [F,NC,L]
</IfModule>

# REDIRICT __________________
Redirect 301 /index.html /index.php
<IfModule mod_rewrite.c>
	RewriteRule ^news/([^/\.]+)/?$ news.php?news=$1 [L]
	RewriteRule ^(.*\.((js)|(css)))$ plugin/GzipFile.php?file=$1
	RewriteRule \.css$ plugin/GzipFile.php?file=$1
	RewriteRule \.js$ plugin/GzipFile.php?file=$1
</IfModule>
RedirectMatch 301 /blog(.*) http://www.black-web.ru/$1

P.S.

… Для тех у кого всё получилось, идём на www.webpagetest.org мерять красоту до и после.
Andrey_Zentavr
Кому надо берите полностью готовый .htaccess здесь
Данный файл показал самую высокую производительность на тестах.
Также там куча всего закомментировано о чем я не упомянул в статье и что может пригодиться в тех или иных случаях.

habr.com

Конфигурирование сайта с помощью файла .htaccess

Web — сервер Apache — это мощный и многофункциональный программный продукт с разнообразными возможностями. В данной статье будут расмотрены приёмы конфигурирования Apache, наиболее часто встречающиеся при разработке Web — сайтов.

Как известно, все настройки сервера Apache находятся в файлe httpd.conf, доступ к которому имеется не всегда. Например, если используется виртуальный сервер на хостинге, когда один сервер Apache обслуживает сотни сайтов, то, естественно, нельзя позволить владельцу одного сайта менять конфигурацию сервера, которая отразится на всех остальных сайтах. Тем не менее Web — сервер Apache допускает конфигурирование на уровне отдельных каталогов при помощи файлов .htaccess. Именно на работу с этими файлами, как единственными конфигурационными файлами, которые доступны большинству Web — разработчиков, и будет сделан основной упор в этой статье.

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

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

Изменения, вносимые в файлы .htaccess, вступают в силу немедленно и не требуют перезагрузки сервера в отличие от изменений, вносимых в главный конфигурационный файл httpd.conf.

Для того, чтобы файлы .htaccess можно было использовать, необходимы соответствующие настройки главного конфигурационного файла httpd.conf, где должны быть прописаны директивы, которые разрешат файлу .htaccess переопределять конфигурацию Web-сервера в каталоге. Список этих директив задаётся директивой AllowOverride.

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

Для того чтобы дать директивам файлов .htaccess максимальные права на изменения директив, значение директивы AllowOverride в файле httpd.conf должно быть равно All. Оно является значением по умолчанию.

AllowOverride All

Запретить переопределение любых директив в конфигурационных файлах .htaccess можно при помощи значения None:

AllowOverride None

Замечание
Название конфигурационного файла можно изменить, и например, назвать его не .htaccess, a access.conf. За название этого файла отвечает директива AccessFileName в файле httpd.conf. Изменение названия конфигурационного файла .htaccess не рекомендуется, т.к. это может усложнить дальнейшую поддержку сервера.

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

  • Пути к файлам и каталогам должны указываться от корня сервера, например, /pub/articles/masters/php/
  • При указании абсолютных url обязательно должны быть зааданы протоколы, например: Redirect / http://www.site.ru
  • В файлах .htaccess недопустимы пробелы в указаниях путей к файлам и в названиях самих файлов, т.к. это приводит к генерации кода ответа 500 — ошибка конфигурации сервера: «Internal Server Error».

Могут возникнуть ситуации, когда необходимо изменить состав индексных файлов, например, если нужна индексная страница index.php, а в основном конфигурационном файле httpd.conf она не прописана. Эту задачу можно решить при помощи файла .htaccess, в котором необходимо создать директиву DirectoryIndex, где будут перечислены имена индексных страниц:

DirectoryIndex index.php index.shtml index.html

При запросе каталога без указания имени файла сначала будет осуществлён поиск страницы с именем index.php. Если страницы с таким именем нет в каталоге, то аналогичные операции будут произведены с файлом index.shtml и т.д. до конца списка, пока не будет найдена и открыта соответствующая страница.

Часто требуется запретить отображение списка файлов в каталоге, если не указан или отсутствует индексный файл. Например, запретить отображение содержимого каталога с изображениями. Если такой запрет не поставить, то пользователь, обратившийся напрямую к такому каталогу, получит список всех изображений.

Options –Indexes

Ни один сайт не затрахован от возникновения ошибок. Самой частой ошибкой является переход по ссылке на несуществующую страницу. В этом случае Apache генерирует код ответа 404 и отображает автоматически сгенерированную страницу с сообщением об ошибке. Наличие несуществующих страниц производит плохое впечатление на посетителей сайта. Это впечатление можно сгладить, если вместо стандартных страниц, подставлять собственные страницы с сообщением об ошибке. За назначение страниц — обработчиков кодов ответа протокола HTTP несёт ответственность директива ErrorDocument

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

После директивы ErrorDocument следует указать код ответа и страницу, на которую необходимо перенаправить посетителя при возникновении данного кода ответа.

  • 401 ошибка — Запрос требует аутентификации пользователя (Unautorized).
  • 403 ошибка — Доступ к запрашиваемому ресурсу запрещён (Forbidden).
  • 404 ошибка — Запрашиваемый документ на сервере отсутствует (Not Found).
  • 500 ошибка — Ошибка конфигурации сервера или внешней программы (Internal Server Error).

Обычно PHP-код выполняется в файлах с расширениями php. Иногда возникают ситуации, когда необходимо выполнять PHP-код в файлах с другим расширением. В этом случае можно дать указание Web-серверу выполнять PHP-код не только в файлах с расширением php, но и в файлах с расширением html.

RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml

Первая строка удаляет обработчик файлов с расширениями html и htm, а вторая строка сообщает серверу о необходимости использовать для файлов с расширениями htm и html обработчик PHP

Указанная кодировка отправляется браузеру в заголовке Content-Type и позволит браузеру клиента автоматически переключиться на требуемую кодировку.

AddDefaultCharset Windows-1251

При загрузке файлов на сервер можно указать, в какой кодировке сервер должен ожидать файл.

CharsetSourceEnc windows-1251

Включённая на хостинге опция MultiViews может вызвать неожиданные проблемы, например, отображение несуществующих страниц сайта. Допустим, на сайте существует страница с адресом http://www.sait.ru/down.php, и если посетители обратятся к несуществующему каталогу http://www.sait.ru/down/, то включённая опция MultiViews вместо этого каталога подставит файл down.php. Однако подстановка будет выполнена не полностью — пути к изображениям, таблицам стилей и т.п. будут подставлены неверно. То есть страница будет отображена с искажениями. Для подавления такого поведения Apache опцию MultiViews следует отключить.

Options -MultiViews

Для того чтобы посетители не могли получить доступ к служебным файлам из окна браузера, можно запретить доступ к таким файлам. Для этого используется директива запрета Deny и разрешения доступа Allow.

Примечание
Использование директив Deny и Allow управляет только доступом к файлам из браузера, либо из другой программы-клиента. Подобные запреты не распространяются на скрипты сервера.

Deny from all

При использовании такой директивы будет запрещён доступ из браузера ко всем файлам и каталогам текущего каталога.

Deny from all

Здесь запрещен доступ только к файлам с именем config.php.

Deny from all

* — любая последовательность символов, исключая символ слеша (/).

Deny from all

Запрещен доступ к файлам с расширением inc, conf и cfg

Deny from 195.135.232.70

Order deny,allow
Deny from all
Allow from 195.135.232.70

Директива Order позволяет задать порядок, в котором будут выполняться директивы. Сначала выполняется директива запрета доступа(директива Deny), а затем разрешается доступ то для IP-адреса 195.135.232.70 (директива Allow). Если в первой строке поменять порядок следования директив на Order allow,deny, то доступ для IP-адреса 195.135.232.70 не будет открыть, т.к. директива Deny, выполняемая последней, перекроет действие директивы Allow.

Примечание
Следует отметить, что разрешение доступа с определённого IP-адреса иногда может не сработать. Например, в том случае, если на хостинге установлен обратный кэширующий proxy-сервер. Если директивы разрешения доступа не работают, то вам нужно обратиться по этому вопросу в службу технической поддержки хостинга.

Часто встречаются задачи, когда все запросы к определённому каталогу или странице нужно перенаправить (redirect) на другой адрес. Это можно сделать с помощью директив Redirect и RedirectMatch. Они сообщают, что ресурс по запрошенному url отсутствует, и указывают адрес, по которому следует перейти. Директивы Redirect посылают браузеру соответствующий заголовок, и уже браузер осуществляет перенаправление.

Redirect / http://www.site.ru/

Redirect /books/index.php http://www.site.ru/newbooks/

RedirectMatch /books/.* http://www.site.ru/newbooks/

RedirectMatch /.* http://www.site.ru/

*Републикация cтатьи возможна при сохранении исходного текста и подписи в конце статьи.

www.internet-technologies.ru

PHP — .htaccess не работает apache

У меня есть сервер из сервиса AWS EC2, работающий в Linux Ubuntu, и я установил apache, php и mysql.

Я добавил .htaccess файл в корне моего документа /var/www/html,

Я ввел этот код в нем:
ErrorDocument 404 /var/www/html/404.php и это все еще не обнаруживается.

Я продолжал вводить эту команду несколько раз: sudo service httpd restart перезагрузить сервер, но не отображаются изменения …

Как я могу это исправить … Я сделал что-то не так?

Заранее спасибо!

115

Решение

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

Во-вторых, если файлы .htaccess игнорируются, вам необходимо проверить, правильно ли установлен AllowOverride. Увидеть http://httpd.apache.org/docs/2.4/mod/core.html#allowoverride для деталей. Вам также необходимо убедиться, что он установлен в правильной области — то есть в правильном блоке в вашей конфигурации. Будь уверен НЕ редактирование одного в блоке, например.

В-третьих, если вы хотите убедиться, что файл .htaccess действительно читается, поместите в него мусор.
Недопустимая строка, такая как «INVALID LINE HERE», в вашем файле .htaccess приведет к ошибке 500 Server, когда вы укажете браузеру на каталог, содержащий этот файл. Если это не так, то у вас не настроен AllowOverride правильно.

247

Другие решения

  1. Включить модуль Apache mod_rewrite

    a2enmod rewrite

  2. добавьте следующий код в /etc/apache2/sites-available/default

    AllowOverride All

  3. Перезапустите Apache

    /etc/init.d/apache2 restart

99

Если вы перепробовали все вышеперечисленное, которые являются действительными и хорошими ответами, и ваш файл htaccess не работает или читается, измените директиву в apache2.conf файл. Под Ubuntu путь /etc/apache2/apache2.conf

Изменить <Directory> директива, указывающая на ваши общедоступные веб-страницы, где находится файл htaccess. Меняться от AllowOverride None

в AllowOverride All

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

У меня была такая же проблема, и я нашел ответ и объяснение в Ubuntu Ask! Форум https://askubuntu.com/questions/421233/enabling-htaccess-file-to-rewrite-path-not-working

35

За Ubuntu,
Сначала запустите эту команду:

sudo a2enmod rewrite

Затем отредактируйте файл /etc/apache2/sites-available/000-default.conf используя nano или vim с помощью этой команды: —

sudo nano /etc/apache2/sites-available/000-default.conf

Тогда в 000-default.conf файл, добавьте это после строки DocumentRoot /var/www/html, Если ваш корневой каталог html — это что-то другое, то напишите:

<Directory "/var/www/html">
AllowOverride All
</Directory>

Сделав все, перезапустите apache с помощью команды sudo service apache2 restart

18

Скорее всего, для AllowOverride установлено значение None. в разделе каталога apache2.conf, расположенном в папке / etc / apache2

Попробуйте установить для него AllowOverride All

5

Просто выполните 3 шага

  1. Включите mode_rewrite, используя следующую команду

    sudo a2enmod переписать

Пароль будет запрошен. Так что введите свой пароль

  1. Обновите свой 000-default.conf или же default.conf файл находится в / и т.д. / apache2 / сайты-доступны / каталог. Вы не можете редактировать его напрямую. поэтому используйте следующую команду, чтобы открыть

    sudo gedit /etc/apache2/sites-available/000-default.conf

Или же
sudo gedit /etc/apache2/sites-available/default.conf

ты получишь

DocumentRoot / var / www / html

ИЛИ ЖЕ

DocumentRoot / var / www

линия. Добавьте следующий код после него.

<Directory /var/www/html/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

Сделайте так, чтобы путь тега каталога был таким же, как показано в вашем файле.

  1. Перезагрузите сервер apache, используя следующую команду

    перезапуск службы sudo apache2

5

По моему опыту, директива / var / www / directory запрещает директивы virtualhost. Так что, если вы перепробовали все предложения и все еще не работали, и вы используете виртуальные хосты, попробуйте это;

1 — убедитесь, что у вас есть
AllowOverride All директива в
/etc/apache2/sites-available/example.com.conf

2 — Проверьте / var / www / Директивы директивы в /etc/apache2/apache2.conf (возможно, в строке 164), которая выглядит так;

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

Если есть AllowOverride None директива изменить его на
AllowOverride All или просто сбежать

4

По умолчанию Apache запрещает использование файла .htaccess для применения правил перезаписи, поэтому

Шаг 1 — Включение mod_rewrite (если не включено)
Во-первых, нам нужно активировать mod_rewrite. Он доступен, но не включен с чистой установкой Apache 2.

$ sudo a2enmod rewrite

Это активирует модуль или предупредит вас, что модуль уже включен. Чтобы эти изменения вступили в силу, перезапустите Apache.

$ sudo systemctl restart apache2

mod_rewrite теперь полностью включен. На следующем шаге мы настроим файл .htaccess, который будем использовать для определения правил перезаписи для перенаправлений.

Шаг 2 — Настройка .htaccess
Откройте файл конфигурации Apache по умолчанию, используя nano или ваш любимый текстовый редактор.

$ sudo nano /etc/apache2/sites-available/000-default.conf

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

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>

. . .
</VirtualHost>

Сохраните и закройте файл. Чтобы эти изменения вступили в силу, перезапустите Apache.

$ sudo systemctl restart apache2

Готово. Ваш .htacess должен работать.
Эта ссылка может действительно помочь кому-то https://www.digitalocean.com/community/tutorials/how-to-rewrite-urls-with-mod_rewrite-for-apache-on-ubuntu-16-04

2

web-answers.ru

Полезные хаки и сниппеты для .htaccess / Habr

Это перевод очень интересной лично для меня статьи, которым я хочу поделиться с уважаемым хабрасообществом. Некоторые из приведенных рецептов я уже встречал на Хабре, но разрозненно и далеко не все из нижеприведенного.

О предназначении файла .htaccess знает каждый веб-разработчик. На базовом уровне он позволяет управлять доступом к каталогам сайта. Но добавляя в него различные дополнительные фрагменты кода, с ним можно сделать и много других интересных вещей.

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

Итак, полезные примеры использования. htaccess:

1. Управление доступом к файлам и каталогам

Защита паролем — это одно, но иногда может понадобиться полностью блокировать доступ пользователей к определенному файлу или папке. Обычно это относится к системным папкам, таким, например, как includes, доступ к которым должны иметь приложения, но не пользователи.

Чтобы сделать это, поместите данный код в файл. htaccess и сохраните его в каталоге к которому закрываете доступ:

deny from all

Однако учитывайте, что доступ будет блокирован для всех пользователей, включая и вас. Открыть доступ для конкретного пользователя можно прописав его IP-адрес. Вот код, который для этого потребуется:
order deny,allow 
deny from all 
allow from xxx.xxx.xxx.xxx

где xxx. xxx. xxx. xxx — это ваш IP. Для задания разрешенных диапазонов IP-адресов вы можете заменить три последние цифры. Например, написав вместо них «0/12», вы зададите диапазон IP-адресов одной сети, что избавит вас от необходимости вводить в список все разрешенные IP-адреса отдельно.

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

<Files .htaccess>
 order allow,deny
 deny from all
 </Files>

Если вы хотите указать определенные IP-адреса которым надо запретить доступ, перечислите их при помощи allow from.

Если же вы хотите заблокировать доступ к файлам определенного типа, используйте этот код:

<FilesMatch ".(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
 Order Allow,Deny
 Deny from all
 </FilesMatch>

2. Запрет на просмотр директорий

Для предотвращения просмотра директорий сайта добавьте в .htaccess следующий код:
Options All -Indexes

Если же по какой-то причине вы хотите разрешить просмотр всех директорий, используйте код:
Options All +Indexes

3. Ускорение времени загрузки за счет сжатия файлов

Сжимать можно файлы любого типа. Например, для сжатия HTML-файлов добавьте код:
AddOutputFilterByType DEFLATE text/html

Для сжатия текстовых файлов используйте:
AddOutputFilterByType DEFLATE text/plain

Вы также можете сжать JavaScript или включить сжатие для других различных типов файлов командами:
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml

Кроме того, вы можете сжать все ваши JavaScript, HTML и CSS файлы при помощи GZIP. Для этого используйте следующий код:
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$ 
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text\.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image\.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* 
</IfModule>

4. Защита сайта от вставки изображений с других ресурсов

Если вы хотите запретить добавление ссылок на изображения со сторонних ресурсов, добавьте в файл .htaccess код:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

Не забудьте заменить yourdomain.com на имя вашего домена.
5. Блокировка посетителей, перешедших с определенного домена

Если вы не хотите видеть на своем сайте пользователей с конкретного домена, то вы можете запретить им доступ. Например, пользователей с нежелательных ресурсов (сайты для взрослых, хакерские сайты и т. д.) вы можете перенаправлять на страницу 403 Forbidden. Для этого необходимо включить mod_rewrite, хотя, как правило, он включен по умолчанию. Добавьте в .htaccess код:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} bannedurl1.com [NC,OR]
RewriteCond %{HTTP_REFERER} bannedurl2.com [NC,OR]
RewriteRule .* - [F]
</ifModule>

Вам необходимо заменить bannedurl1.com и bannedurl2.com доменами, которые вы хотите внести в черный список. Вы можете использовать флаг [NC], указывающий, что введенное доменное имя нечувствительно к регистру. Флаг [F] указывает на тип действия, в данном случае — отображение ошибки 403 Forbidden. Если вы хотите запретить несколько сайтов, используйте флаги [NC, OR] для каждого домена, если же вы хотите запретить использование одного домена — используйте только флаг [NC].
6. Блокирование запросов от определенных браузеров

Если в ваших файлах журналов появились записи о посещении особых браузеров (это могут быть имитирующие работу браузера боты или пауки), вы можете запретить им доступ на свой сайт, добавив несколько строк в. htaccess:
RewriteEngine On 
RewriteBase / 
SetEnvIfNoCase Referer "^$" bad_user
SetEnvIfNoCase User-Agent "^badbot1" bad_user
SetEnvIfNoCase User-Agent "^badbot2" bad_user
SetEnvIfNoCase User-Agent "^badbot3" bad_user
Deny from env=bad_user

Замените badbot1, badbot1 и т. д. именами ботов из вашего журнала. Это закроет посторонним программам доступ к вашему сайту.
7. Кэширование файлов

Кэширование файлов — еще один способ ускорить загрузку вашего сайта. Вот то, что вам нужно прописать в .htaccess:
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>

Вы можете добавить больше типов файлов (или удалить некоторые из них) в перечисленныq в данном примере список файлов. Вы также можете указать время сохранения файлов в кэше (в секундах) при помощи переменной max-age.
8. Отключение кэширования для разных типов файлов

Если вы не хотите кэшировать определенные типы файлов, можно не включать их в список. Однако иногда файлы могут сохраняться в кэше даже не будучи явно перечисленными в списке, в этом случае вы можете отключить кэширование для них индивидуально. Чаще всего отключать кэширование требуется для динамических файлов, таких как сценарии. Пример требуемого для этого кода:

<FilesMatch ".(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>

Просто укажите типы файлов, для которых нужно отключить кэширование.
9. Обход диалога загрузки

По умолчанию при попытке загрузить файл с веб-сервера отображается диалог, который спрашивает вас, хотите ли вы сохранить файл или открыть его. Этот диалог особенно раздражает при скачивании больших медиа- или PDF-файлов. Если файлы, которые вы загрузили на сервер, предназначены исключительно для скачивания, вы можете облегчить жизнь пользователей, установив загрузку действием по умолчанию. Добавьте в. htaccess следующее:
AddType application/octet-stream .pdf
AddType application/octet-stream .zip
AddType application/octet-stream .mp3

10. Переименование файла .htaccess

Если вы по каким-то причинам хотите переименовать файл .htaccess, то вы можете это сделать. Теоретически, переименование файла .htaccess не должно вызывать проблем с приложениями, запущенными на вашем сервере, но если вы заметите появление ошибок выполнения сценариев после переименования файла, то просто переименуйте его обратно.
AccessFileName htac.cess

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

Если вы хотите установить главную страницу, отличную от стандартной (index.html, index.php, index.htm и т. д.), добавьте следующий код в файл .htaccess:
DirectoryIndex mypage.html

Замените mypage.html на URL страницы, которую вы хотите использовать в качестве главной.
12. Перенаправление на защищенное соединение HTTPS

Если вы используете HTTPS и хотите перенаправить пользователей на защищенные страницы вашего сайта, добавьте в файл .htaccess следующие строки:
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

13. Ограничение максимального размера загружаемых файлов в PHP, максимального размера передаваемых данных, максимального времени выполнения скриптов и т.п.

.htaccess позволяет устанавливать некоторые значения, непосредственно влияющие на работу PHP приложений. Например, если вы хотите установить в PHP ограничение на размер загружаемых файлов, чтобы не забивать хостинг большими файлами:
php_value upload_max_filesize 15M

Вы можете установить любое значение, в примере размер файла ограничен 15M (MБ). Помимо этого вы можете ограничить максимальный размер передаваемых при загрузке в PHP данных:
php_value post_max_size 10M

Вы можете заменить 10М на любое требуемое вам значение. Если вам не требуется постоянное выполнение скриптов, вы можете ограничить время их выполнения с помощью строки:
php_value max_execution_time 240

240 — время выполнения (в секундах), после которого скрипт будет остановлен, вы можете изменить это значение на любое другое. Наконец, если вы хотите ограничить время анализа скриптом исходных данных, используйте следующий код:
php_value max_input_time 180

Установите вместо 180 любое требуемое вам время (в секундах).
14. Скрытие типов файлов

Иногда нужно, чтобы пользователи не знали, какие типы файлов находятся на вашем сайте. Один из способов скрыть эту информацию — сделать так, чтобы все ваши файлы отображались как HTML или PHP файлы:
ForceType application/x-httpd-php
ForceType application/x-httpd-php

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

Источник

UPD (спасибо akuma) расширение РНР для скрытия формата файлов приведено как пример и использование этого трюка в реальном проекте может оказаться небезопасным

habr.com

Мой вариант .htaccess / Habr

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

Вашему вниманию мой вгляд на правила обработки URL с объяснениями и коментариями «почему так?».

Сперва логика

Объясню сперва логику:
1) все страницы имеют .html окончания.
2) все языки для страниц имеют вид pagename.en.html или pagename.html для языка по умолчанию. Никто, конечно, не запрещает иметь ссылки, где язык идёт вначале как /en/
3) «входной» скрипт только один в docroot.
4) Разрешены запросы на другие скрипты только в docroot
5) Соглашение по определению окончаний в url:
# site.com/
# site.com/index -> site.com/
# site.com -> site.com/
# site.com/file/ -> site.com/file.html
# site.com/file -> site.com/file.html
# site.com/dir/file ->site.com/dir/file.html
# site.com/dir/file/ -> site.com/dir/file.html
Но это можно менять.
Структура .htaccess

Теперь перейдём к самой структуре .htaccess. Замечу ещё, что будет работать только для апачей версий 2.x и старше.

Сперва полностью код:

DirectoryIndex index index.html
DirectorySlash off
Options -Indexes -MultiViews
# Rules
# site.com/
# site.com/index -> site.com
# site.com	-> site.com/
# site.com/file/ -> site.com/file.html
# site.com/file  -> site.com/file.html
# site.com/dir/file ->site.com/dir/file.html
# site.com/dir/file/ -> site.com/dir/file.html
# no ending slashes

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} \.(css|jpg|gif|png|zip|rar|doc|xls|js|tif|tiff|docx|xlsx|ico)$|test\.php$
	RewriteRule ^(.*)$ $1 [L,QSA]

# nothing to do there in subrequests
RewriteCond %{ENV:NS}	!=1
RewriteCond %{IS_SUBREQ} =true
	RewriteRule (.*) $1 [L,QSA]
#do NS=0?


RewriteCond %{REQUEST_URI} ^/index$ [OR]
RewriteCond %{REQUEST_URI} ^/index[.]+(\w+)$
	RewriteRule . / [R=301,L]

# remove trailing slashes
# if want external redirect use correct external redir [R=301,L] or [R=301] for correct internal or simple redir [L]
RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_URI} (.*)/$
	RewriteRule . %1.html [R=301,L,E=NS:1,QSA]

# if whants .html endings
RewriteCond %{REQUEST_URI} !^(.+)\.(html|php)$
	RewriteRule . %{REQUEST_URI}.html [R=301,L]

# fix multidots in endings (missed language) index..html instead of index.en.html
RewriteCond %{REQUEST_URI} ^(.+)\.\.+(\w+)$
	RewriteRule . %1.%2 [R=301,L]
# otherways
#RewriteCond %{REQUEST_URI} (.+)\.(html|php)$
#	RewriteRule . %1 [R=301,L]

# any php filename in root dir
# this makes secure loses
RewriteCond %{REQUEST_URI} ^[\w\-.]+$
RewriteCond %{REQUEST_FILENAME} (.*)\.(html|php)$
RewriteCond %1.php -s [OR]
RewriteCond %1.html -s
	RewriteRule . %1.%2 [L,QSA]

RewriteRule (.*) entry.php?URI=$1 [L,QSA]
#
Разбор полёта

Теперь, разберём построчно.
DirectoryIndex index index.html
DirectorySlash off
Options -Indexes -MultiViews

Сразу важный момент: выключена автоматическая подстановка слеша в конец и выключен MultiViews (с ним работать не будет).
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} \.(css|jpg|gif|png|zip|rar|doc|xls|js|tif|tiff|docx|xlsx|ico)$|test\.php$
    RewriteRule ^(.*)$ $1 [L,QSA]

Третья строчка проверяет на статические файлы — их пропускаем не меняя запрос. Возможно, стоило бы сделать проверку на наличие файла, но оставим это дело механизму 404. Последний |test\.php$ сделан для различных тестовых файлов, но на продакшене это дело надо убирать.

# nothing to do there in subrequests
RewriteCond %{ENV:NS}	!=1
RewriteCond %{IS_SUBREQ} =true
    RewriteRule (.*) $1 [L,QSA]
#do NS=0?

Самая важная часть — так как идёт преобразование расширений (далее по коду), то скрипт будет уходить всегда в подзапрос и может уйти в бесконечный цикл. Для того, чтобы этого не произошло, ловим начало подзапросов и отправляем на уже исправленный «входной» скрипт текущий запрос по URL. Это можно посмотреть включив rewrite_log в апаче.
RewriteCond %{REQUEST_URI} ^/index$ [OR]
RewriteCond %{REQUEST_URI} ^/index[.]+(\w+)$
    RewriteRule . / [R=301,L]

Все попытки попасть на `/index’ или `index.html’ будут перенаправлены на URL `/’.
# remove trailing slashes
# if want external redirect use correct external redir [R=301,L] or [R=301] for correct internal or simple redir [L]
RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_URI} (.*)/$
    RewriteRule . %1.html [R=301,L,E=NS:1,QSA]

Решает одну из частей «соглашения»: убирает завершающие `/’ из обращений к страницам. Правила описаны в пункте (5) вначале. В комментарии написано, что если хотим использовать внешний редирект (меняется url в строке браузера), то используем [R=301,L], если внутренний (не меняет url в строке браузера), то [R=301] или [L]
# if whants .html endings
RewriteCond %{REQUEST_URI} !^(.+)\.(html|php)$
    RewriteRule . %{REQUEST_URI}.html [R=301,L]

Решает ещё одну из частей «соглашения», что все запросы на страницы должны иметь окончание .html. Небольшими манипуляциями можно сделать наоборот.
# fix multidots in endings (missed language) index..html instead of index.en.html
RewriteCond %{REQUEST_URI} ^(.+)\.\.+(\w+)$
	RewriteRule . %1.%2 [R=301,L]

Решает проблему пропущенного языка в строке запроса перенаправляя на страницу с языком по умолчанию.
# any php filename in root dir
# this makes secure loses
RewriteCond %{REQUEST_URI} ^[\w\-.]+$
RewriteCond %{REQUEST_FILENAME} (.*)\.(html|php)$
RewriteCond %1.php -s [OR]
RewriteCond %1.html -s
	RewriteRule . %1.%2 [L,QSA]

Решает часть соглашения №4 — разрешает запросы к другим php/html файлам в папке %DOCUMENT_ROOT% сайта.
RewriteRule (.*) entry.php?URI=$1 [L,QSA]

Если всё как надо, то направляем запрос на «входной» скрипт.
Разное

Что касается флагов апача: везде используется QSA (дополнять строку запроса) — об этом забывать нельзя, чтобы не терять параметры. E=NS:1 устанавливает переменную окружения NS равную 1 — нужна для определения подзапроса (подзапроса созданного правилами преобразования по «соглашению», а не каким-нибудь другим подзапросом).

habr.com

Настройка файла htaccess

Файлы .htaccess для всех

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

Следует отметить, что файлы .htaccess не работают в системах на базе Windows, хотя их можно отредактировать и выгрузить на совместимый веб-сервер, а в системах на базе Linux они скрыты по умолчанию.

Для локальной работы с файлами htaccess можно использовать XAMPP (или MAMP) на Mac – пакет, который устанавливает и конфигурирует Apache, PHP и MySQL. Для редактирования файлов .htaccess на Mac нужно применить текстовый редактор, позволяющий открывать скрытые файлы, такой как TextWrangler.

Файл .htaccess поддерживает тот же формат, что и основной файл конфигурации Apache: httpd.conf. Многие настройки, изменяемые с помощью основного файла конфигурации, кроме того, могут в нем регулироваться, и наоборот.

Настройка, измененная в файле .htaccess, отменит ту же настройку в основном файле конфигурации для содержащего этот файл каталога, а также для всех его подкаталогов.

Файлы .htaccess для всех

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее

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

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

Переадресация и перезапись URL

Файлы .htaccess широко используются для выполнения переадресации или перезаписи URL’ов. Это очень удобно при оптимизации SEO после смены доменного имени, или при реорганизации файловой структуры, или для сокращения длинного некрасивого URL’а и превращения его в более удобный и запоминающийся.

Переадресация

Переадресация может быть совсем простой, как тут:

Redirect 301 ^old\.html$ http://localhost/new.html

Redirect 301 ^old\.html$ http://localhost/new.html

Тут код статуса HTTP устанавливается на 301 (постоянно меняемый) и переадресовывает все запросы к old.html прямиком на new.html. Для совмещения URL’а с переадресацией мы применяем регулярное выражение, что даёт нам отличный контроль над применением только верного URL’а, но усложняет конфигурацию и управление ей. Требуется полный URL переадресовываемого ресурса.

Перезапись

Перезапись может быть простой, как здесь:

RewriteEngine on RewriteRule ^old\.html$ new.html

RewriteEngine on

RewriteRule ^old\.html$ new.html

В этом примере мы всего лишь делаем простую переадресацию от одного файла к другому, что тоже выполняется прямиком, без изменений, отображаемых в адресной строке. Первая команда, RewriteEngine on, просто гарантирует, что механизм перезаписи включён.

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

RewriteRule ^old\.html$ http://hostname/new.html [r=301]

RewriteRule ^old\.html$ http://hostname/new.html [r=301]

Метка r вызывает внешнее перенаправление, вот почему тут приведен полный URL (пример URL здесь) новой страницы. Также при использовании метки можно определить код состояния. Таким образом обновляется адресная строка браузера пользователя.

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

RewriteRule ^products/([^/]+)/([^/]+)/([^/]+) product.php?cat=$1&amp;amp;brand=$2&amp;amp;prod=$3

RewriteRule ^products/([^/]+)/([^/]+)/([^/]+) product.php?cat=$1&amp;amp;brand=$2&amp;amp;prod=$3

Это правило позволит посетителям использовать такой URL, как products/turntables/technics/sl1210, и преобразовать его в product.php?cat=turntables&brand=technics&prod=sl1210. Круглые скобки между косыми чертами в вышеприведенном регулярном выражении – это собирающие группы – мы можем применять любую из них, как $1, $2 и $3 соответственно. Символьный класс [^/]+ в круглых скобках означает совпадение любого символа один или более раз, кроме косой черты

На практике перезапись URL может оказаться (и обычно так и есть) намного сложнее и добиться с её помощью можно гораздо большего. Перезапись URL лучше объясняется в отдельных учебниках, поэтому здесь мы её детально рассматривать не станем.

Создание необычных страниц ошибок

Стандартную страницу ошибки 404 демонстрировать больше не «круто». На многих сайтах пользуются возможностью, предоставляемой ошибкой file not found, для того, чтобы внести в нее некоторую долю юмора, хотя подразумевается, что худо-бедно, но страница с ошибкой 404 должна соответствовать стилю и теме любой другой страницы сайта.

Что очень близко связано с перезаписью URL’а, с помощью файла .htaccess легко обслуживать пользовательскую страницу ошибки 404 вместо стандартной:

ErrorDocument 404 «/404.html»

ErrorDocument 404 «/404.html»

Это – всё, что нам нужно; при возникновении ошибки 404 всегда отображается указанная страница. Еще мы можем конфигурировать страницы для отображения многих других ошибок сервера.

Ограничение доступа к определённым ресурсам

С помощью файлов .htaccess можно включить защиту любого файла или каталога паролем — для всех пользователей или в зависимости от домена или IP адреса. Это, помимо всего, и есть один из основных методов их применения. Чтобы предотвратить доступ ко всему каталогу, просто создаём файл .htaccess, содержащий следующий код:

AuthName «Username and password required» AuthUserFile /path/to/.htpasswd Require valid-user AuthType Basic

AuthName «Username and password required»

AuthUserFile /path/to/.htpasswd

Require valid-user

AuthType Basic

Затем этот файл нужно поместить в каталог, требующий защиты. Указатель AuthName определяет сообщение, которое следует отобразить в диалоговом окне «имя пользователя/пароль», AuthUserFile должен послужить путём к файлу .htpasswd. Указатель Require уточняет, что только авторизовавшиеся пользователи могут получить доступ к защищённому файлу, в то время как AuthType установлен на Basic.

Чтобы защитить некий файл, можно обернуть вышеупомянутый код в указатель files, определяющий защищённый файл:

Файлы .htaccess для всех

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее

<Files «protectedfile.html»> AuthName «Username and password required» AuthUserFile /path/to/.htpasswd Require valid-user AuthType Basic </Files>

<Files «protectedfile.html»>

   AuthName «Username and password required»

   AuthUserFile /path/to/.htpasswd

   Require valid-user

    AuthType Basic

</Files>

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

Блокирование доступа к определённым объектам

Файл .htaccess, кроме того, применяется для быстрой и легкой блокировки всех запросов с IP-адреса или агента пользователя. Чтобы блокировать некий IP-адрес, просто добавьте в свой файл .htaccess следующий код:

order allow,deny deny from 192.168.0.1 allow from all

order allow,deny

deny from 192.168.0.1

allow from all

Указатель order говорит Apache, в каком порядке оценивать директивы allow/deny. В данном случае первым оценивается allow, а за ним deny. Указатель allow from all оценивается самым первым (даже если появляется после deny) и разрешаются все IP, далее, если IP клиента соответствует указанному в параметре deny, доступ запрещается. Таким образом, доступ разрешается всем IP, кроме указанного. Следует отметить, что, кроме того, можно лишить доступа целые блоки IP, предоставив более короткий IP, например, 192.168.

Для запрета запросов с агента пользователя можно сделать следующее:

RewriteCond %{HTTP_USER_AGENT} ^OrangeSpider RewriteRule ^(.*)$ http://%{REMOTE_ADDR}/$ [r=301,l]

RewriteCond %{HTTP_USER_AGENT} ^OrangeSpider

RewriteRule ^(.*)$ http://%{REMOTE_ADDR}/$ [r=301,l]

В этом примере любой клиент со строкой HTTP_USER_AGENT, начинающейся с OrangeSpider (вредный бот), перенаправляется обратно к адресу, с которого был инициирован. Регулярное выражение сопоставляет любой одиночный символ (.) ноль или более раз (*) и переадресовывает к переменной среды %{REMOTE_ADDR}. Метка l, которую мы здесь применили, отдает Apache указание рассматривать это соответствие как последнее правило, и, таким образом, до перезаписи прочие правила выполняться не будут.

Вмешиваемся в режим визуализации IE

Наряду с контролем над тем, как сервер отвечает на определённые запросы, можно сделать кое-что с браузером пользователя, например, вынудить IE отображать страницы, используя определённый движок визуализации. Так, можно применить модуль mod_headers, если тот присутствует, для установки заголовка X-UA-Compatible:

Header set X-UA-Compatible «IE=Edge»

Header set X-UA-Compatible «IE=Edge»

Путем добавления этой строки в файл .htaccess IE отдается указание применить самый высокий доступный режим отображения. Как показывает HTML5 Boilerplate, еще можно избежать установки этого заголовка в не требующие его файлы, использовав параметр FilesMatch следующим образом:

<FilesMatch «\.(js|css|gif|png|jpe?g|pdf|xml|oga|ogg|m4a|ogv|mp4|m4v|webm|svg|svgz|eot| ttf|otf|woff|ico|webp|appcache|manifest|htc|crx|xpi|safariextz|vcf)$» > Header unset X-UA-Compatible </FilesMatch>

<FilesMatch «\.(js|css|gif|png|jpe?g|pdf|xml|oga|ogg|m4a|ogv|mp4|m4v|webm|svg|svgz|eot|

ttf|otf|woff|ico|webp|appcache|manifest|htc|crx|xpi|safariextz|vcf)$» >

      Header unset X-UA-Compatible

</FilesMatch>

Осуществление кэширования

Кэширование легко настраивается и способно заставить сайт быстрее загружаться. Этим сказано все! Установив большой срок действия для тех элементов сайта, которые не меняются часто, можно предотвратить постоянные запросы браузера к неизменённым ресурсам.

Если вы проверяете свой сайт на Google PageSpeed или Yahoo’s YSlow и получили сообщение об установке долгосрочных заголовков, то вот как это можно исправить:

ExpiresActive on ExpiresActive on ExpiresByType image/gif «access plus 1 month» ExpiresByType image/png «access plus 1 month» ExpiresByType image/jpg «access plus 1 month» ExpiresByType image/jpeg «access plus 1 month» ExpiresByType video/ogg «access plus 1 month» ExpiresByType audio/ogg «access plus 1 month» ExpiresByType video/mp4 «access plus 1 month» ExpiresByType video/webm «access plus 1 month»

ExpiresActive on

ExpiresActive on

ExpiresByType image/gif                 «access plus 1 month»

ExpiresByType image/png                 «access plus 1 month»

ExpiresByType image/jpg                 «access plus 1 month»

ExpiresByType image/jpeg                «access plus 1 month»

ExpiresByType video/ogg                 «access plus 1 month»

ExpiresByType audio/ogg                 «access plus 1 month»

ExpiresByType video/mp4                 «access plus 1 month»

ExpiresByType video/webm                «access plus 1 month»

Разные параметры ExpiresByType можно установить для любого контента, перечисленного в применяемом вами инструменте исполнения, или чего угодно, где нужно управлять кэшированием. Первый указатель, ExpiresActive on, просто гарантирует, что генерация Expires headers включена. Эти указатели зависят от Apache, загружающего модуль mod_expires.

Включаем сжатие

Другое предупреждение, которое можно получить в процессе проверки производительности, относится к включению сжатия, и это тоже можно исправить, просто обновив файл .htaccess:

FilterDeclare COMPRESS FilterProvider COMPRESS DEFLATE resp=Content-Type $text/html FilterProvider COMPRESS DEFLATE resp=Content-Type $text/css FilterProvider COMPRESS DEFLATE resp=Content-Type $text/javascript FilterChain COMPRESS FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no

FilterDeclare   COMPRESS

FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/html

FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/css

FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/javascript

FilterChain     COMPRESS

FilterProtocol  COMPRESS  DEFLATE change=yes;byteranges=no

Эта схема сжатия работает на новых версиях Apache (2.1+), применяющих модуль mod_filter. Он использует алгоритм DEFLATE для сжатия контента в зависимости от его типа, и в этом случае мы определяем text/html, text/css и text/javascript (которые, скорее всего, окажутся видами файлов, помеченных в PageSpeed/Yslow).

применить, используя параметр FilterDeclare – в данном случае COMPRESS. Затем перечисляем виды контента, для которого нам нужно использовать этот фильтр. Указатель FilterChain отдает команду серверу выстроить цепь фильтров на основе перечисленных нами параметров FilterProvider. Параметр FilterProtocol дает возможность определять опции, примененные к последовательности фильтров, всякий раз, когда она запускается; опции, которые нам следует использовать – это change=yes (контент может быть изменён фильтром (в данном случае – сжат) и byteranges=no (фильтр должен применяться только к определённым файлам).

В более старых версиях Apache модуль mod_deflate используется для конфигурирования сжатия DEFLATE. В этом случае у нас меньше контроля над тем, как фильтруется контент, а указатели проще:

SetOutputFilter DEFLATE AddOutputFilterByType DEFLATE text/html text/css text/javascript

SetOutputFilter DEFLATE

AddOutputFilterByType DEFLATE text/html text/css text/javascript

Здесь мы всего лишь устанавливаем алгоритм сжатия с помощью указателя SetOutputFilter, а затем определяем виды контента, который нужно сжать, используя параметр AddOutputFilterByType.

Обычно веб-сервер применяет один из этих модулей в зависимости от того, какая версия Apache используется. Обычно вы знаете это заранее, но если создаётся универсальный файл .htaccess, который можно использовать на многих сайтах, или которым можно поделиться с другими людьми, и потому неизвестно, какие модули применить, то вы можете использовать оба вышеприведенных программных блока, обёрнутых в указатели IfModule module_name для того, чтобы использовался подходящий модуль и сервер не выдавал по 500 ошибок, если мы станем вдруг конфигурировать модуль, невнесенный в список. Вам нужно знать, что для хостов, работающих с большим количеством сайтов с единственного блока, сжатие отключают, поскольку при сжатии на сервере происходит небольшая потеря производительности CPU.

Заключение урока по настройке файла htaccess

Мы рассмотрели несколько примеров основновных настроек файла htaccess и то как решать определённые задачи, интересующие нас, создающих и поддерживающих сайты. Как обычно случается с подобным вводным уроком, затронутая тема представляется как введение в отдельный предмет. Существует множество дополнительных опций и конфигураций, которые следует исследовать, так что я настоятельно рекомендовал бы вам продолжить чтение на особенно интересные вам темы.

На этом, урок по настройке файла htaccess, окончен надеюсь вам всё понравилось.

Автор: Dan Wellman

Источник: http://net.tutsplus.com/

Редакция: Команда webformyself.

Файлы .htaccess для всех

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Узнать подробнее Файлы .htaccess для всех

Хотите узнать, что необходимо для создания сайта?

Посмотрите видео и узнайте пошаговый план по созданию сайта с нуля!

Смотреть

webformyself.com