Htaccess директивы – Файл .htaccess — настройка перенаправлений и управление конфигурацией веб-сервера

Содержание

Директивы HTACCESS

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

Установить порядок проверки и запуска индексного файла папки:

DirectoryIndex index.php index.html

Включить расширение mod_rewrite:

RewriteEngine On

Определение кодировки, в которой сервер "отдает" файлы (варианты: KOI8-R, UTF-8, Windows-1251):

AddDefaultCharset windows-1251

Определение кодировки на загружаемые файлы (варианты: KOI8-R, UTF-8, Windows-1251):

CharsetSourceEnc windows-1251

Задаем собственные страницы ошибок:

ErrorDocument 404 http://www.site.ru/404.php

Эта директива задает файл, который будет вызван при обращении к директории без указания имени файла:

DirectoryIndex index.php
DirectoryIndex index.html index.php index.shtml

Если при передаче файлов через формы (при указанном enctype="multipart/form-data") бинарные данные повреждаются:

CharsetRecodeMultipartForms Off

Сохранение(загрузка) файлов вместо открытия:

AddType application/octet-stream .rar .doc .mov .avi .pdf .xls .mp4

Переадресация по языку:

RewriteEngine on
RewriteCond %{HTTP:Accept-Language} (ru) [NC]
RewriteRule .* КУДА [L]

Директивы Order, Allow, Deny

Order - порядок действия директив Allow и Deny. Allow - разрешить доступ. Deny - отказать в доступе.

Order Allow,Deny
Allow from all
Deny from 100.99.99.1, 100.99.99.2

Директива Options

Директива Options позволяет задать ряд общих параметров, из которых наиболее популярны следующие: ExecCGI (разрешить выполнение CGI -скриптов), FollowSymLinks (обрабатывать симлинки), Includes (разрешить SSI), IncludesNOEXEC (разрешить SSI без запуска скриптов), Indexes (показывать посетителю список файлов, если в выбранном каталоге нет файла index.html или его аналога).

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

Options +Includes

Запрет выдачи листинга каталога без индексного файла

Options -Indexes

Разрешить показывать список файлов в директории без индексного файла:

Options Indexes

Директива IndexIgnore позволяет осуществлять фильтрацию списка файлов по расширению:

IndexIgnore *.php* *.pl

Директива RewriteLock

RewriteLock file-path

Директива RewriteLock определяет имя файла синхронизации, который нужен mod_rewrite для связи с RewriteMap программами.

Директива RewriteLog

RewriteLog file-path

Директива RewriteLog устанавливает имя файла, в котором сервер ведет журнал любых происходящих действий по преобразованиям URL. Если это имя не начинается со слэша (/) в этом случае путь считается от Server Root. В конфигурационном файле сервера эта директива должна встречаться только один раз. Для отключения ведения журнала преобразований не рекомендуется устанавливать Filename в /dev/null, потому что хотя механизм преобразований и не производит вывод в файл журнала, внутри он все ещё ведет журнализацию. Это замедлит сервер без каких-либо преимуществ для администратора! Для отключения ведения журнала либо удалите, либо закомментируйте директиву RewriteLog либо используйте RewriteLogLevel 0!

Директива RewriteLogLevel

RewriteLogLevel N

Директива RewriteLogLevel устанавливает уровень детализации журнала механизма преобразований. По-умолчанию уровень 0, означающий что журнализация не ведется, в то время как 9 или более означает что записываются практически все действия. Для отключения журнализации действий механизма преобразований просто установите уровень на 0. Это отключает ведение журнала для всех преобразований. Использование больших значений уровня очень сильно замедлит ваш сервер Apache! Используйте журнал преобразований на уровне большем чем 2 только для отладочных целей!

Переменные сервера

HTTP заголовки:соединение & запрос:
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE
внутренние сервера:системные:специальные:
DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ

Настройка .htaccess. Полное руководство

Директивы htaccess

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

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

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

Настройка .htaccess. Полное руководство

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

Для начала — пару слов, что такое .htaccess? Процитирую официальный сайт веб-сервера Apache:

.htaccess файлы (или «распределенные конфигурационные файлы») позволяют задавать большое количество дополнительных параметров и разрешений для работы веб-сервера в отдельных каталогах (папках), таких как управляемый доступ к каталогам, переназначение типов файлов и т. д, без изменения главного конфигурационного файла.

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

.htaccess переадресация

Блокируем хотлинки с других сайтов

Есть нехорошие товарищи, которые могут использовать картинки с вашего ресурса для использования в своих проектах. Они используют ваши изображения на своих сайтах, другими словами, используют вашу пропускную способность в своих целях, по аналогии с перемещением изображений на поддомен. Будем с ними бороться… Заменим любую картинку, на которую ведет хотлинк с другого сайта, на какое-нибудь предупреждающее изображение или на что хватит фантазии. В коде не забывайте менять адреса на ваши URL.

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+.)?ваш-урл.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
#Замените путь к картинке
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/noHL.jpg [L]

 Перенаправим RSS фиды WordPress на Feedburner

Я не думаю, что кто-то пользуется чем-то другим, отличным от Feedburner. Удобно для пользователя, удобно для владельца блога, статистика, опять же. Если вы еще не используете — крайне рекомендую. Код ниже перенаправит все ваши RSS потоки на ваш аккаунт, не забывайте только вставить нужный адрес.

RedirectMatch 301 /feed/(atom|rdf|rss|rss2)/?$ http://feedburner.com/yourfeed/
RedirectMatch 301 /comments/feed/(atom|rdf|rss|rss2)/?$ http://feedburner.com/yourfeed/

В этом примере идет перенаправление двух потоков: основного RSS и обновление комментариев, если посетитель подписан на обновления.

Изменим страницы ошибок

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

ErrorDocument 400 /errors/badrequest.html
ErrorDocument 401 /errors/authreqd.html
ErrorDocument 403 /errors/forbid.html
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/serverr.html

#Замените /errors/*.html на путь к вашим страницам ошибок

В этом примере идет перенаправление в случае основных ошибок. 404 я тоже добавил, хотя CMS обычно отрабатывают такие моменты, но бывали случаи.

301 и 302 редирект или перенаправление

301 редирект или, так называемое постоянное перенаправление — говорит о том, что страница поменяла адрес или URL и перенаправляет на новую страницу. Если у вас на сайте была проиндексированная ПС страница, а вы поменяли ее адрес — в обязательном порядке сделайте 301 редирект на новую страницу. При 301 редиректе старая страница не индексируется, а вместо нее «подставляется» новая.

RewriteEngine on
Redirect 301 /old-page http://ваш-урл.ру/new-page

Собственно, похожий пример внимательный читатель увидит выше, в случае перенаправления RSS. Да, технология та же.
Бывает так, что сайт переезжает на новый домен, нужно сохранить структуру ссылок, а их могут быть сотни и тысячи, на каждую установить перенаправление нереально. Код ниже поможет разобраться с такой ситуацией:

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://newdomain.ru/$1 [R=301,L]

Есть интересная методика «скрытия» внешних ссылок путем 301 редиректа. Допустим, у вас есть «сквозная» ссылка в сайдбаре, которая ведет на ваш профиль в Google+, она внешняя, то есть ведет на внешний ресурс. Для SEO очень хорошо, когда таких ссылок как можно меньше. Можно спрятать их и сделать внутренними.

Технология производства внутренних ссылок из внешних:

  • ставим ссылку на мнимую страницу,
  • настраиваем 301 редирект в htaccess с этой страницы на реальную страницу вашего профиля
  • посетитель ничего не чувствует, ПС довольны 😉

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

RewriteEngine on
Redirect 302 /old-page http://ваш-урл.ру/new-page

Код абсолютно такой же, как в случае с постоянным перенаправлением.
302 редирект удобно использовать, когда проводятся какие-либо долгосрочные работы на сайте и не нужно показывать посетителям «поломанные» страницы. В таком случае вам поможет этот код:

RewriteEngine on
RewriteCond %{REQUEST_URI} !/inside.html$
RewriteCond %{REMOTE_ADDR} !^123.123.123.123
RewriteRule $ /inside.html [R=302,L]

 Склеиваем сайты с www и без него

Очень плохо, когда сайт доступен по двум адресам, ПС это очень не любят. Склеить это в один адрес поможет код ниже:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.ваш-урл.com$ [NC]
RewriteRule ^(.*)$ http://ваш-урл.com/$1 [R=301,L]

В этом примере — главное зеркало это адрес без www. Если необходимо сделать наоборот — поменяйте www местами, сверху уберите, внизу добавьте.

Показ страниц в зависимости от IP

SetEnvIf REMOTE_ADDR 192.168.0.1 REDIR="redir"
RewriteCond %{REDIR} redir
RewriteRule ^/$ /about.html

Добавлять адреса можно дублированием первой строки, в последней — меняется страница для перенаправления.

Перенаправляем на главную

Перенаправление со страниц site.com/index.php и site.com/index.html на страницу site.com/. За код спасибо Василию Красноженову.

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.html HTTP/
RewriteRule ^index.html$ http://site.com [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.php HTTP/
RewriteRule ^index.php$ http://site.com [R=301,L]

 Директивы htaccess. Разделяем доступы

Запрет доступа к сайту

Бывает такое, что необходимо запретить доступ посетителям с определенного IP, спамерам или еще кому нехорошему.

Order Allow,Deny
Allow from all
Deny from 192.168.0.1

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

Order Deny,Allow
Deny from all
Allow from 192.168.0.1

Добавлять адреса аналогично предыдущему примеру.

Запрещаем просмотр нежелательным User-Agent

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

SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]

Order Allow,Deny

Allow from all
Deny from env=bad_bot

Полный список известных User-Agent вы можете найти на сайте http://www.user-agents.org/

Запрещаем доступ к определенному файлу

В примере стоит запрет на доступ к файлам wp-config и htaccess, тем самым повышается уровень общей защиты. Очень нужная директива, рекомендую добавить в свои файлы

# защищаем wpconfig.php
<Files wp-config.php>
order allow,deny
deny from all
</Files>

#защищаем htaccess
<Files .htaccess>
order allow,deny
deny from all
</Files>

Аналогично можно защитить css и js файлы, которые используются плагинами:

<Files ~ ".(js|css)$">
order allow,deny
allow from all
</Files>

Скачивание определенных типов файлов

Современные браузеры такие умные, что иногда становится страшно. Мой Хром иногда пытается внутри себя открывать для просмотра PDF файлы, иногда вешаясь насмерть. С помощью htaccess можно принудительно сказать браузеру, что делать с тем или иным типом файлов, не оставляя этот момент на его усмотрение. В данном случае это скачивание. Дополнительные типы файлов можно добавить по аналогии.

AddType application/octet-stream .pdf
AddType application/octet-stream .zip
AddType application/octet-stream .avi

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

Если у вас постоянный IP адрес, можно только ему давать доступ к админ-панели WordPress

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "Example Access Control"
AuthType Basic
<LIMIT GET>
order allow, deny
deny from all
allow from Ваш IP
</LIMIT>

Директивы htaccess. Техническая оптимизация и ускорение

Запрещаем автоматическое индексирование файлов

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

Options -Indexes

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

Вы знаете о том, что данные на сервере можно сжать, а клиент их распакует у себя? Код ниже как раз включает такую штуку. Нужно только убедиться, что gzip разрешен на вашем хостинге, но обычно он есть.

<FilesMatch ".js.gz$">
ForceType text/javascript
Header set Content-Encoding: gzip
</FilesMatch>

<FilesMatch ".css.gz$">
ForceType text/css
Header set Content-Encoding: gzip
</FilesMatch>

<FilesMatch ".js$">
ForceType text/javascript
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !".*Safari.*"
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*).js$ $1.js.gz [L]
ForceType text/javascript
</FilesMatch>

<FilesMatch ".css$">
ForceType text/css
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !".*Safari.*"
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*).css$ $1.css.gz [L]
ForceType text/css
</FilesMatch>

Код не работает для изображений, но к ним применять gzip не рекомендуется. Именно такой код установлен у меня.

Сжатие с применением mod_deflate

Ходят слухи, что с помощью этого мода сжимать данные лучше и сайт работает быстрее. Я не могу протестировать, да и не встречал в Интернете подобных тестов. Если у кого есть такая информация — буду благодарен. А код выложу, мало ли

<ifmodule mod_deflate.c="">
<filesmatch ".(js|css)$"="">
SetOutputFilter DEFLATE
</filesmatch>
</ifmodule>

Включаем кэширование браузера клиента

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

Header append Cache-Control "private"
FileETag MTime Size
ExpiresActive On
ExpiresDefault "access plus 0 minutes"
ExpiresByType image/ico "access plus 1 years"
ExpiresByType text/css "access plus 1 years"
ExpiresByType text/javascript "access plus 1 years"
ExpiresByType image/gif "access plus 1 years"
ExpiresByType image/jpg "access plus 1 years"
ExpiresByType image/jpeg "access plus 1 years"
ExpiresByType image/bmp "access plus 1 years"
ExpiresByType image/png "access plus 1 years"

Указываем кодировку по умолчанию

WordPress работает с кодировкой UTF8 и делает это хорошо, но чтобы гарантированно избежать проблем с кодировкой — укажите ее принудительно, хуже не будет точно.

AddDefaultCharset UTF-8

Ограничиваем число подключений к сайту

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

MaxClients <количество подключений>

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

Разрешаем выполнение php внутри JavaScript

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

AddType application/x-httpd-php .js
AddHandler x-httpd-php5 .js
<filesmatch ".(js|php)$">
SetHandler application/x-httpd-php
</filesmatch>

Вот и все, что касается htaccess и его стандартного использования. Я не стал упоминать о защите папок паролями, потому что не считаю это правильным, о «защите» от спама, путем блокировки запросов запросов без передачи Referer, потому что все современные спам-машины давно умеют это делать. Ну и прочие вещи, которые не считаю грамотно реализованными.

Напоследок хочу представить вам сервис тестирования вашего htaccess файла — http://htaccess.madewithlove.be/.

Описание директив .htaccess

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

Директивы .htaccess

Перенаправление (редирект)

На другой адрес

Redirect / http://www.example.com

При запросе определенных страниц

redirect /data http://www.expample.com/data
redirect /forum http://forum.example.com

По маске имени файла

Следующая строки определяют, что все запросы кроме запросов к файлам с расширениями .gif и .jpg будут перенаправлены на файл index.php

RewriteEngine On
RewriteRule !.(gif|jpg)$ index.php

Работает только при наличии mod_rewrite

По IP-адресам
Если посетитель имеет IP-адрес 192.168.11.1, то ему будет открыта страница data.html

SetEnvIf REMOTE_ADDR 192.168.11.1 REDIR="redir"
RewriteCond %{REDIR} redir
RewriteRule ^/$ /data.html

Работает только при наличии mod_rewrite

Удаление префикса «www.» из адреса

Перенаправление с http://www.mydomain.com на http://mydomain.com

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.mydomain.com$ [NC]
RewriteRule (.*) http://mydomain.com/$1 [R=301]

Работает только при наличии mod_rewrite

Индексные страницы

Переопределение индексного файла

DirectoryIndex index.html index.php index.shtml

Запрет на отображение содержимого каталога при отсутствии индексного файла

Типы файлов

Изменение обработчика по типу файла

Пример переопределения HTML файлов для обработки их с помощью PHP

AddHandler application/x-httpd-php5 .php .htm .html .phtml

Обработка ошибок

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

Кодировка

Отдаваемых файлов

AddDefaultCharset windows-1251

Загружаемых файлов

CharsetSourceEnc windows-1251

Управление доступом

Запрет доступа к файлам

Запрет доступа ко всем файлам и каталогам в текущем каталоге

Запрет доступа к определенному файлу

Запрет доступа к файлам по маске

Спецсимволы для определения маски

? — любой одиночный символ * — любая последовательность символов, исключая символ / (слэш)
Запрет доступа к файлам по регулярному выражению

Определение доступа по IP

order deny,allow
deny from all
allow from 192.168.11.1

Строка order deny,allow определяет, в каком порядке следует выполнять директивы. Сначала выполняется директива запрета доступа, а затем разрешается доступ только для IP-адреса 192.168.11.1. Если в первой строке поменять порядок следования директив на order allow,deny, то доступ для данного IP-адреса не будет открыт, так как директива deny, выполняемая последней перекроет действия директивы allow.

Закрытие каталогов паролем

файл .htaccess

AuthName "Auth message"
AuthType Basic require [username2] … [usernameN]>
AuthUserFile "/full/path/to/.htpasswd"

Пароли хранятся в файле .htpasswd

Директивы перенаправления .htaccess

Иногда просто необходимо осуществлять редирект страниц сайта, в случае смены доменного имени сайта, либо ещё возможен вариант, когда редирект применяется для добавления в конце ссылки слэша – косой черты «/». Так вот для таких целей можно использовать файл .htaccess. Но это очень неудобно, если Ваш сайт имеет от 100 и выше страниц, на это есть другие методы.

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

Redirect / http://www.example.com

# http://www.example.com — URL  на который мы перенаправляем запросы

более сложный пример, мы хотим определенные страницы нашего сайта переадресовывать на другие сайты:

Redirect http://mysite.ru/linux http://www.linux.org

Redirect /linux/download.html http://www.linux.org/dist/download_info.html

Redirect 301 /kernel http://www.linux.org

теперь при наборе http://mysite.ru/linux будут открываться http://www.linux.org. В последнем примере WEB сервер будет передавать код 301, что означает «документ перемещен постоянно».

Синтаксис команды Redirect выглядит следующим образом:

Redirect [status] URL_LOCAL URL_REDIRECT

status : необязательное поле, определяет код возврата, допустимые значения:

* permanent (301 — документ перемещен постоянно)

* temp (302 — документ перемещен временно)

* seeother (303 — смотрите другой)

* gone (410 — убран)

URL_LOCAL : локальная часть URL запрашиваемого документа.

URL_REDIRECT : URL куда должен быть выполнен редирект.

RedirectMatch

Директива RedirectMatch аналогична директиве Redirect за исключением того, что в RedirectMatch возможно использование регулярных выражений, что несомненно может быть удобно в некоторых условиях. Например для организации передачи параметров скрипту в теле URL.

RedirectMatch /(.*)/(.*)/index.html$ http://mysite.ru/script.php?par1=$1&par2=$2

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

В регулярном выражении можно использовать любые печатные символы и пробел, но часть символов имеет особое значение:
  1. Круглые скобки () используются для выделения групп символов. В дальнейшем к ним можно обращаться по номеру.
  2. Символ ^ обозначает начало строки.
  3. Символ $ обозначает конец строки.
  4. Символ . обозначает любой символ.
  5. Символ | обозначает альтернативу. Например, выражения «A|B» означают «A или B».
  6. Символ ? ставится после символа (группы), который может как присутствовать, так и отсутствовать.
  7. Символ * ставится после символа (группы), который может отсутствовать или присутствовать неограниченное число раз подряд.
  8. Символ + действует аналогично символу * с той лишь разницей, что предшествующий ему символ обязательно должен присутствовать хотя бы один раз.
  9. Квадратные скобки [] используются для перечисления допустимых символов.
  10. Квадратные скобки [^] используются для перечисления недоступных символов.
  11. Символ \ ставится перед спецсимволами, если они нужны в своем первозданном виде.
  12. Все, что расположено после символа ‘#’, считается комментарием.

Это все основные примитивы с помощью которых можно построить любое регулярное выражение.

Редирект через .htaccess с использованием mod_rewrite

Этот метод работает в Apache c включенным mod_rewrite — модулем, который позволяет осуществлять ряд полезных функций. Например, преобразование ссылок вида http://site.com/index.php?module=news в более удобную и интуитивно понятную форму для обычного человека: http://site.com/news/. Благодаря ему, мы можем конфигурировать редирект под конкретно взятую ситуацию. Подробнее о возможностях mod_rewrite Вы можете прочитать здесь (http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html).

RewriteEngine on

RewriteBase/

GET /index.html HTTP/1.1

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/

RewriteRule ^index\.php$ http://daxa.com.ua/news.php [R=301,L]

RewriteEngine on — включает механизм преобразования.

RewriteBase — простыми словами можно сформулировать так: RewriteBase указывает директорию преобразования. У нас это корневой каталог.

RewriteCond — в этой директиве мы указывает условие, в случае выполнения которого переходим к RewriteRule.

{THE_REQUEST} — строка HTTP-запроса

RewriteRule — задает правило преобразования URL. Здесь используются регулярные выражения.

[R=301,L] — флаг R указывает на редирект «301», L — останавливает процесс преобразования.

Помните, что редирект делают не только для посетителей Web-сайта, а и для поисковых роботов, от которых зависит рейтинг Вашего Интернет-портала в поисковых системах.

Твитнуть

Добавить комментарий

Учимся менять установки с помощью .htaccess

Описание синтаксиса и примеры работы с .htaccess
Файл .htaccess позволяет индивидуально настраивать работу веб-сервера для вашего сайта.

Общие вопросы по .htaccess
  Для чего служит .htaccess?
  Правила написания .htaccess
Определение области действия директив
  Директива Files
  Директива FilesMatch
Перенаправления:
  Директива Redirect
  Директива RedirectMatch
  Директивы RewriteCond и RewriteRule
  Пример: разные страницы, в зависимости от IP адреса посетителя
  Пример: разные страницы, в зависимости от ссылающейся страницы
  Перенаправление посетителя при запросе определенных страниц
Ограничение доступа (lдля различных адресов)
  Директива Order
  Директива Deny
  Директива Allow
  Пример: запрет на доступ для всех
  Пример: разрешение на доступ для определенных IP адресов
  Пример: запрет на доступ для всех за исключением определенных IP адресов
  Пример: запрет на доступ для определенный файл
  Пример: запрет на доступ для определенной группы файлов
Установка пароля
  Директива AuthName
  Директива AuthType
  Директива AuthUserFile
  Директива AuthUserFile
  Пример: разрешает доступ директории всем пользователям.
  Пример: разрешает доступ к директории только 3-м пользователям
  Пример: ограничение доступа к определенным файлам
  Пример: ограничение доступа к одному файлу
Управление сервером
  Директива DirectoryIndex - изменения страницы по умолчанию (стартовой)
  Директива AddOutputFilter - установка фильтра (SSI)
  Директива SetHandler - установка обработчика (PHP, Parser)
  Директива ErrorDocument - обработка ошибок
Утилита htpasswd
Добавил файл .htaccess, и теперь сервер выдает 500 ошибку. Почему?


Для чего служит .htaccess?

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

Вы можете создавать несколько файлов .htaccess - по одному для каждой директории на вашем сайте.

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

Если файл .htaccess расположен в корневой директории сервера, то его действия распространяется на весь сервер, кроме тех директорий, где находится другой файл .htaccess (и кроме всех папок "ниже" этой папки со вторым .htaccess).

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

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

Правила написания .htaccess

 пути к файлам (директориям) указываются от корня сервера.

Правильный пример:

DirectoryIndex /home/st1331/www/data/main.html

Ошибка:

DirectoryIndex /www/news/main.html

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

Правильный пример:

Redirect /oldsite/ http://www.starsite.ru/

Ошибка:

Redirect /oldsite/ www.starsite.ru/

Комментарии - строки, начинающиеся с символа #.

В выражениях можно использовать переменные окружения, например %{REMOTE_ADDR} или %{HTTP_REFERER}.

  Файл .htaccess должен быть записан в UNIX-формате - это означает что перевод строки должен задаваться в нем одним символом (0x0A), а не двумя (0x0D 0x0A), как в DOS или Windows


Определение области действия директив

Директива Files

Оописание: дирктива Files ограничивает действие директив одним файлом
Syntax: <FILES filename> ...
filename имя файла
Пример:

Order Deny,Allow
Deny from all
Allow from 192.168.1.1
Директива FilesMatch

Оописание: дирктива Files ограничивает действие директив одним файлом
Syntax: <FILES regex> ...
regexp: регулярное выражение (шаблон), описывающее группу файлов.
Пример:

Order Allow,Deny
Allow from all
Deny from 192.168.1.1


Перенаправления (редиректы)

Директива Redirect

Описание: Выполняет редирект посетителя, запрашивающего документ на другой URL. Выполняет внешний редирект (сообщая браузеру о необходимости загрузить другой URL).
Синтаксис: Redirect [status] URL-path URL
status: необязательное поле, определяет код возврата, допустимые значения: permanent (301 - документ перемещен постоянно), temp (302 - документ перемещен временно), seeother (303 - смотрите другой), gone (410 - убран).
URL-path: локальная часть URL запрашиваемого документа.
URL: URL куда должен быть выполнен редирект

Redirect temp /           http://www.starsite.ru/newyear.html
Redirect temp /index.html http://www.starsite.ru/newyear.html
Redirect permanent /prices2002.html http://www.starsite.ru/prices2003.html
Директива RedirectMatch

Описание: Выполняет редирект посетителя, запрашивающего документ на другой URL. Выполняет внешний редирект (сообщая браузеру о необходимости загрузить другой URL). Директива аналогична Redirect, за исключением того, что вместо адреса запрашиваемого документа пишется регулярное выражение (шаблон)
Синтаксис: Redirect [status] regexp URL
status: необязательное поле, определяет код возврата, допустимые значения: permanent (301 - документ перемещен постоянно), temp (302 - документ перемещен временно), seeother (303 - смотрите другой), gone (410 - убран).
URL-path: локальная часть URL запрашиваемого документа.
regexp: регулярное выражение (шаблон), описывающее группу URL-ей.

RedirectMatch (.*).gif$ http://www.starsite.ru$1.png
RedirectMatch (.*.jpg)$ http://www.starsite.ru$1

Пример: разные страницы, в зависимости от IP адреса посетителя. В примере посетители с адреса 192.168.1.1 перенаправляются на другую страницу

RewriteCond %{REMOTE_ADDR} 192.168.1.1
RewriteRule ^/$ /anoter_index_pahe.html [L]

Пример: разные страницы, в зависимости от ссылающейся страницы. В примере посетители, приходящис со страницы http://www.starsite.ru/ вместо /prices.html получают /anoter_prices.html

RewriteCond %{HTTP_REFERER} http://www.starsite.ru/recep.html
RewriteRule ^/prices.html$ /anoter_prices.html [L]

Перенаправление посетителя при запросе определенных страниц:

Это уже для всех сетевых вирусов и сканеров. Теперь любой запрос с адресом /_vti_bin будет автоматически перенаправляться на Microsoft:

redirect /_vti_bin http://www.starsite.ru
redirect /scripts http://www.starsite.ru
redirect /MSADC http://www.starsite.ru
redirect /c http://www.starsite.ru
redirect /d http://www.starsite.ru
redirect /_mem_bin http://www.starsite.ru
redirect /msadc http://www.starsite.ru
RedirectMatch (.*)cmd.exe$ http://www.starsite.ru$1 

Ограничение доступа (пароли)


Директива Order

Описание: Устатавливает порядок работы директив Deny и Allow
Синтаксис: Order порядок
порядок может принимать значения Deny,Allow или Allow,Deny
По умолчанию: Order Deny,Allow

Директива Deny

Описание: Запрещает доступ определенных клиентов к ресурсам.
Синтаксис: Deny from all|host
host может принимать значения IP адреса или имени хоста.

Директива Allow

Описание: Разрешает доступ определенных клиентов к ресурсам.
Синтаксис: Deny from all|host
host может принимать значения IP адреса или имени хоста.

Пример: запрет на доступ для всех

Order Deny,Allow
Deny from all

Пример: разрешение на доступ для определенных IP адресов

Order Deny,Allow
Deny from all
Allow from .iho.ru
Allow from 192.168.1.1

Пример: запрет на доступ для всех за исключением определенных IP адресов

Order Allow,Deny
Allow from all
Deny from .iho.ru
Deny from 192.168.1.1

Пример: запрет на доступ для определенный файл. В примере запрещается доступ к файлу .htpasswd для всех посетителей

Order Deny,Allow
Deny from all

Пример: запрет на доступ для определенной группы файлов. В примере запрещается доступ к файлам с расширениями "lib" и "pm" для всех посетителей

Order Deny,Allow
Deny from all

Установка пароля на доступ


Директива AuthName

Описание: значение AuthName будет выводиться для посетителя и может использоваться для пояснения запроса авторизации.

Директива AuthType

Описание: Эта директива выбирает тип аутентификации. Возможны следующие типы: Basic and Digest.
Синтаксис: AuthType Basic|Digest

Директива AuthUserFile

Описание: значение AuthUserFile указывает имя файла с паролями для аутентификации пользователей. Файл с паролями может быть создаен утилитой htpasswd. Путь к файлу с паролями задается относительно корня веб-сервера. Храните файл с паролями в папке, доступ к которой закрыт для пользователей..
Синтаксис: AuthUserFile путь-к-файлу

Директива Require

Описание: Определяет пользователей, которые могут получить доступ
Синтаксис: Require имя-пользователя|valid-user
Указывая valid-user вы разрешаете доступ всем пользователям, перечисленным в файле паролей.

Пример: разрешает доступ директории всем пользователям:

AuthName "Restricted area"

AuthType Basic
AuthUserFile /home/st1331/www/data/.htpasswd
Require valid-user

Пример: разрешает доступ к директории только 3-м пользователям:

AuthName "Very restricted area"
AuthType Basic
AuthUserFile /home/st1331/www/data/.htpasswd
Require antonio solo marina

Пример: ограничение доступа к определенным файлам (в этом примере ограничен доступ к zip архивам)

AuthName "Only valid users can download zip files."
AuthType Basic
AuthUserFile /home/st1331/www/data/.htpasswd
Require valid-user

Пример: ограничение доступа к одному файлу (в этом примере ограничен доступ к файлу .htpasswd)

AuthName "Access restricted."
AuthType Basic
AuthUserFile /home/st1331/www/data/.htpasswd
Require antonio solo

Управление сервером

Директива DirectoryIndex - изменения страницы по умолчанию (стартовой)

Описание: Позволяет изменить страницу, которая будет показываться при обращении к директории
Синтаксис: DirectoryIndex page [page]
page - название стартовой страницы. Может быть указано несколько страниц.
Пример:

DirectoryIndex main.html index.php test.shtml

Директива ErrorDocument - обработка ошибок

Описание: позволяет устанавливать альтернативные страницы ошибок
Синтаксис: ErrorDocument code URL-path
URL-path - локальный адрес страницы
code - код ошибки. Наиболее типичные коды ошиброк:
401 - Требуется авторизация (Authorization Required)
403 - пользователь не прошел аутентификацию, запрет на доступ (Forbided)
404 - запрашиваемый документ (файл, директория) не найден (Not Found)
500 - внутренняя ошибка сервера - ошибка скрипта или ошибка в синтаксисе файла .htaccess - (Internal Server Error)

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

Директива AddOutputFilter - установка фильтра (SSI)

  SetOutputFilter INCLUDES
 

Директива SetHandler - установка обработчика (PHP, Parser)

Описание: устанавливает обработчик для файлов в заданной директории
Синтаксис: SetHandler handler-name

SetHandler php-script

Директива AddHandler - установка обработчика (PHP, Parser)

Описание: устанавливает обработчик для файлов указанного типа
Синтаксис: AddHandler handler-name filename-extension

AddHandler php-script .html
AddHandler parser-script .htm

Директива AddDefaultCharset - установка обработчика (PHP, Parser)

По умолчанию на сервере установлена кодировка Windows-1251

AddDefaultCharset koi8-r

Как заставить Апач обрабатывать SSI директивы?

SSI позволяют "собирать" страницу из кусочков. В одном кусочке у вас код меню, в другом код верхней части страницы, в третьем - нижней. А посетитель видет обычную страницу, которая состоит из того кода, который входит в ваши кусочки. Необходимы обязательные установки в httpd.conf: В блоке, начинающемся с и заканчивающийся в строку Options Indexes добавьте Includes. После, в файле .htaccess пишем:

AddOutputFilter Includes .html .htm

Как поставить запрет на отображение содержимого директории при отсутствии индексного файла?

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


htpasswd

Директива htpasswd служит для создания файла с паролями, который может быть использован при аутентификации пользователей веб-сервером.

Пример: создание файла с паролями и добавление в него 1 имени:

htpasswd -c Filename username 

Пример: Добавление или изменение файла с паролями

htpasswd Filename username2 

Добавил файл .htaccess, и теперь сервер выдает 500 ошибку. Почему?

500-я ошибка может быть вызвана следующими причинами:
1. неверный синтаксис .htaccess
2. файл .htaccess записан в формате Windows, а должен быть записан в формате UNIX

Директива RewriteCond файла .htaccess

У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!

Директива RewriteCond

Описание: Определяет условие при котором происходит преобразование
Синтаксис: RewriteCond СравниваемаяСтрокаУсловие
Значение по умолчанию: None
Контекст: server configvirtual hostdirectory.htaccess
Разрешение: FileInfo
Статус: Расширение
Модуль: mod_rewrite

Директива RewriteCond определяет условия для какого-либо правила. Перед директивой RewriteRule располагаются одна или несколько директив RewriteCond. Следующее за ними правило преобразования используется только тогда, когда URI соответствует условиям этой директивы

и также условиям этих дополительных директив.

СравниваемаяСтрока строка которая может содержать следующие дополнительные конструкции вдополении к простому тексту:

  • RewriteRule обратные_связи: Это обратные связи вида

    $N

    (0 <= N<= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteRule (единственной, следующей сразу затекущим набором директив RewriteCond).
  • RewriteCond обратные_связи: Это обратные связи вида

    %N

    (1 <= N<= 9) предоставляющие доступ ксгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteCond втекущем наборе условий.
  • RewriteMap расширения: Это расширения вида

    ${mapname:key|default}

    Смотрите документацию по RewriteMap для получения более подробной информации.
  • Переменные сервера: Это переменные вида

    %{

    NAME_OF_VARIABLE}

    где NAME_OF_VARIABLE может быть строкой взятой из следующего списка:
    HTTP заголовки:соединение & запрос:
    HTTP_USER_AGENT
    HTTP_REFERER
    HTTP_COOKIE
    HTTP_FORWARDED
    HTTP_HOST
    HTTP_PROXY_CONNECTION
    HTTP_ACCEPT
    REMOTE_ADDR
    REMOTE_HOST
    REMOTE_USER
    REMOTE_IDENT
    REQUEST_METHOD
    SCRIPT_FILENAME
    PATH_INFO
    QUERY_STRING
    AUTH_TYPE
    внутренние сервера:системные:специальные:
    DOCUMENT_ROOT
    SERVER_ADMIN
    SERVER_NAME
    SERVER_ADDR
    SERVER_PORT
    SERVER_PROTOCOL
    SERVER_SOFTWARE
    TIME_YEAR
    TIME_MON
    TIME_DAY
    TIME_HOUR
    TIME_MIN
    TIME_SEC
    TIME_WDAY
    TIME
    API_VERSION
    THE_REQUEST
    REQUEST_URI
    REQUEST_FILENAME
    IS_SUBREQ

    Эти переменные полностью соответствуют названным похожим образом MIME-заголовкам HTTP, и переменным сервера Apache или полям struct tm систем Unix. Большинство из них документрованны в других местах руководства или в спецификации CGI. Те, что являются для mod_rewrite специальными включают:

    IS_SUBREQ
    Будет содержать текст если запрос выполняется в текущий момент как подзапрос, в другом случае. Подзапросы могут быть сгенерированны модулями которым нужно иметь дело с дополнительными файлами или URI для того чтобы выполнить собственные задачи.
    API_VERSION
    Это версия API модуля Apache (внутренний интерфейс между сервером и модулем) в текущей сборке сервера, что определено в include/ap_mmn.h. API версия модуля соответствует используемой версии Apache (для версии Apache 1.3.14, к примеру это 19990320:10), однако это в основном интересно авторам модулей.
    THE_REQUEST
    Полная строка HTTP запроса отправленная браузером серверу (т.е., GET /index.html HTTP/1.1>). Она не включает какие-либо дополнительные заголовки отправляемые браузером.
    REQUEST_URI
    Ресурс, запрошенный встроке HTTP запроса. (В примере выше, это было бы .)
    REQUEST_FILENAME
    Полный путь вфайловой системе сервера кфайлу или скрипту соответствующим этому запросу.

Специальные примечания:

  1. Переменные SCRIPT_FILENAME и REQUEST_FILENAME содержат одинаковые значения, т.е., значение поля filename внутренней структуры request_rec сервера Apache. Первое имя это просто широко известное имя переменной CGI в то время как второе это постоянная копия REQUEST_URI (содержащая значение поля uri структуры request_rec).
  2. Есть специальный формат: %{ENV:переменная} где переменная может быть любой переменной окружения. Это ищется вовнутренних структурах Apache и(если там нет) спомощью вызова getenv() из процесса Apache сервера.
  3. Есть специальный формат: %{HTTP:заголовок} где заголовок может быть любым именем HTTP MIME-заголовка. Это ищется вHTTP запросе. Пример: %{HTTP:Proxy-Connection} значение HTTP заголовка Proxy-Connection:.
  4. Есть специальный формат %{LA-U:переменная} опережающих запросов которые производятся внутренним (основанном наURL) подзапросом для определения конечного значения переменной. Используйте это когда вы хотите использовать переменную для преобразований, которая реально определяется позднее, в какой-либо фазе API, и таким образом недоступна на данном этапе. Для примера когда выхотите преобразовать соответственно переменной
    REMOTE_USER
    из контекста сервера (файл httpd.conf) вы должны использовать %{LA-U:REMOTE_USER} потому что эта переменная устанавливается в фазах авторизации которые идут после фазы трансляции URL в которой иработает mod_rewrite. Сдругой стороны, попричине реализации работы mod_rewrite в контексте каталога (файл .htaccess) через Fixup фазу API и из-за того, фазы авторизации идут до этой фазы, вы просто можете там использовать %{REMOTE_USER}.
  5. Есть специальный формат: %{LA-F:переменная} который создает внутренний (основанный на имени файла) подзапрос для определения конечного значения переменной. В основном это тоже самое что и формат LA-U приведенный выше.

Условие это шаблон условия, т.е., какое-либо регулярное выражение применяемое к текущему экземпляру СравниваемаяСтрока, т.е., СравниваемаяСтрока просматривается на поиск соответствия Условие.

Помните: Условие это perl совместимое регулярное выражение с некоторыми дополнениями:

  1. Вы можете предварять строку шаблона префиксом ! (восклицательный знак) для указания несоответствия шаблону.
  2. Есть некоторые специальные варианты Условие. Вместо обычных строк с регулярными выражениями можно также использовать один из следующих вариантов:
    • <Условие (лексически меньше)
      Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически меньше чем Условие.
    • >Условие (лексически больше)
      Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически больше чем Условие.
    • =Условие (лексически равно)
      Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически равно Условие, т.е. эти две строки полностью одинаковы (символ всимвол). Если Условие имеет вид "" (два знака дюйма идущих подряд) это сравнивает СравниваемаяСтрока с пустой строкой.
    • -d (является ли каталогом)
      СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является каталогом.
    • -f (является ли обычным файлом)
      СравниваемаяСтрока считается путем, проверяется существование этого пути иточто этот путь является обычным файлом.
    • -s (является лиобычным файлом с ненулевым размером)
      СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является обычным файлом, размер которого больше нуля.
    • -l (является лисимволической ссылкой)
      СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является символической ссылкой.
    • -F (проверка существования файла через подзапрос)
      Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим файлом, доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью - это отрицательно сказывается напроизводительности сервера!
    • -U (проверка существования URL через подзапрос)
      Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим URL, доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью - это отрицательно сказывается напроизводительности сервера!

    Замечание

    Все эти проверки также могут быть предварены префиксом восклицательный знак ('!') для инвертирования их значения.

Дополнительно вы можете устанавливать специальные флаги для Условие добавляя

[flags]

третьим аргументом в директиву RewriteCond. Flags список следующих флагов разделенных запятыми:

Пример:

Для выдачи главной страницы сайта в зависимости от установки User-Agent: заголовка запроса, вы можете использовать следующие директивы:

RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
RewriteRule  ^/$   /homepage.max.html  [L]

RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  ^/$   /homepage.min.html  [L]

RewriteRule  ^/$   /homepage.std.html  [L]

Интерпретация: Если у вас Netscape Navigator (который идентифицируется как 'Mozilla'), вы выдаете максимально навороченную страницу, с фреймами, и т.д. Если у вас Lynx (текстовый браузер), вы выдаете наименее навороченную страницу, без рисунков, таблиц и т.д. Если любой другой браузер, выдаете стандартную страницу.

Директива RewriteBase файла .htaccess

У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!

Директива RewriteBase

Описание: Устанавливает базовый URL для преобразований в контексте каталога
Синтаксис: RewriteBase URL-path
Значение по умолчанию: Смотри использование для более подробной информации.
Контекст: directory.htaccess
Разрешение: FileInfo
Статус: Расширение
Модуль: mod_rewrite

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

Настройка по-умолчанию

RewriteBase physical-directory-path

Когда, для какого-нибудь нового URL происходит подстановка(преобразование), этот модуль должен заново вовлечь этот URL в обработку. Для того чтобы иметь возможность сделать это, нужно знать какие у него префикс или база URL. По-умолчанию этот префикс равен самому пути. Однако на некоторых сайтах URL'ы не прямо соответствуют физическим путям, поэтому вы должны использовать директиву RewriteBase для указания правильного префикса URL.

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

Например, предположим следующий конфигурационный файл каталога:

#
#  /abc/def/.htaccess -- конфигурационный файл каталога /abc/def
#  Помните: /abc/def это физический путь /xyz, т.е., у сервера есть
#            директива 'Alias /xyz /abc/def' к примеру

#

RewriteEngine On

#  даем серверу знать что мы работаем через /xyz а не
#  через префикс физического пути /abc/def
RewriteBase   /xyz

#  теперь правила преобразований
RewriteRule   ^oldstuff\.html$  newstuff.html

В примере выше, запрос к /xyz/oldstuff.html корректно преобразуется в физический файл /abc/def/newstuff.html.

Для любителей поковыряться в Apache

Следующий список дает подробную информацию об этапах внутренней работы:

Запрос:
  /xyz/oldstuff.html

Внутренняя работа:
  /xyz/oldstuff.html     -> /abc/def/oldstuff.html  (per-server Alias)
  /abc/def/oldstuff.html -> /abc/def/newstuff.html  (per-dir    RewriteRule)
  /abc/def/newstuff.html -> /xyz/newstuff.html      (per-dir    RewriteBase)
  /xyz/newstuff.html     -> /abc/def/newstuff.html  (per-server Alias)

Результат:
  /abc/def/newstuff.html

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *