Директивы 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? Процитирую официальный сайт веб-сервера 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 с этой страницы на реальную страницу вашего профиля
- посетитель ничего не чувствует, ПС довольны 😉
Подобным образом можно ставить любые другие условно постоянные ссылки.
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.orgRedirect /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
Хотя данный пример и вызовет перезагрузку страницы в дальнейшем его можно будет улучшить. Здесь необходимо сделать небольшое лирическое отступление и поговорить о синтаксисе регулярных выражений.
В регулярном выражении можно использовать любые печатные символы и пробел, но часть символов имеет особое значение:- Круглые скобки () используются для выделения групп символов. В дальнейшем к ним можно обращаться по номеру.
- Символ ^ обозначает начало строки.
- Символ $ обозначает конец строки.
- Символ . обозначает любой символ.
- Символ | обозначает альтернативу. Например, выражения «A|B» означают «A или B».
- Символ ? ставится после символа (группы), который может как присутствовать, так и отсутствовать.
- Символ * ставится после символа (группы), который может отсутствовать или присутствовать неограниченное число раз подряд.
- Символ + действует аналогично символу * с той лишь разницей, что предшествующий ему символ обязательно должен присутствовать хотя бы один раз.
- Квадратные скобки [] используются для перечисления допустимых символов.
- Квадратные скобки [^] используются для перечисления недоступных символов.
- Символ \ ставится перед спецсимволами, если они нужны в своем первозданном виде.
- Все, что расположено после символа ‘#’, считается комментарием.
Это все основные примитивы с помощью которых можно построить любое регулярное выражение.
Редирект через .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 onRewriteBase/
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 запрашиваемого
документа.
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
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_ACCEPTREMOTE_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_SOFTWARETIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIMEAPI_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQЭти переменные полностью соответствуют названным похожим образом MIME-заголовкам HTTP, и переменным сервера Apache или полям
систем Unix. Большинство из них документрованны в других местах руководства или в спецификации CGI. Те, что являются для mod_rewrite специальными включают:struct tm
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
- Полный путь вфайловой системе сервера кфайлу или скрипту соответствующим этому запросу.
Специальные примечания:
- Переменные SCRIPT_FILENAME и REQUEST_FILENAME содержат одинаковые значения, т.е., значение поля
filename
внутренней структурыrequest_rec
сервера Apache. Первое имя это просто широко известное имя переменной CGI в то время как второе это постоянная копия REQUEST_URI (содержащая значение поляuri
структурыrequest_rec
). - Есть специальный формат:
%{ENV:переменная}
где переменная может быть любой переменной окружения. Это ищется вовнутренних структурах Apache и(если там нет) спомощью вызова getenv() из процесса Apache сервера. - Есть специальный формат:
%{HTTP:заголовок}
где заголовок может быть любым именем HTTP MIME-заголовка. Это ищется вHTTP запросе. Пример:%{HTTP:Proxy-Connection}
значение HTTP заголовка Proxy-Connection:. - Есть специальный формат
%{LA-U:переменная}
опережающих запросов которые производятся внутренним (основанном наURL) подзапросом для определения конечного значения переменной. Используйте это когда вы хотите использовать переменную для преобразований, которая реально определяется позднее, в какой-либо фазе API, и таким образом недоступна на данном этапе. Для примера когда выхотите преобразовать соответственно переменнойREMOTE_USER
из контекста сервера (файлhttpd.conf
) вы должны использовать%{LA-U:REMOTE_USER}
потому что эта переменная устанавливается в фазах авторизации которые идут после фазы трансляции URL в которой иработает mod_rewrite. Сдругой стороны, попричине реализации работы mod_rewrite в контексте каталога (файл.htaccess
) через Fixup фазу API и из-за того, фазы авторизации идут до этой фазы, вы просто можете там использовать%{REMOTE_USER}
. - Есть специальный формат:
%{LA-F:переменная}
который создает внутренний (основанный на имени файла) подзапрос для определения конечного значения переменной. В основном это тоже самое что и формат LA-U приведенный выше.
Условие это шаблон условия, т.е., какое-либо регулярное выражение применяемое к текущему экземпляру СравниваемаяСтрока, т.е., СравниваемаяСтрока просматривается на поиск соответствия Условие.
Помните: Условие это perl совместимое регулярное выражение с некоторыми дополнениями:
- Вы можете предварять строку шаблона префиксом ! (восклицательный знак) для указания несоответствия шаблону.
- Есть некоторые специальные варианты Условие.
Вместо обычных строк с регулярными выражениями можно также использовать
один из следующих вариантов:
- <Условие (лексически меньше)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически меньше чем Условие. - >Условие (лексически больше)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически больше чем Условие. - =Условие (лексически равно)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически равно Условие, т.е. эти две строки полностью одинаковы (символ всимвол). Если Условие имеет вид""
(два знака дюйма идущих подряд) это сравнивает СравниваемаяСтрока с пустой строкой. - -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, это происходить очень быстро и не требует дополнительных накладных расходов.