Table of Contents
Быстрые записки по Apache
OOM
Модуль Rewrite
Модуль rewrite позволяет переписывать\модифицировать к запросы к apache, делать перенаправления или запрещать доступ.
Т.е. пользователь пишет что-то в сроке браузера, берем это что-то и переписываем в формат понятный серверу apache.
Рассмотрим на примере DokuWiki.
Пользователь пишет в строке mykb.ru/qnote, а серверу, что бы он показал страничку, надо передать адрес в виде mykb.ru/doku.php?id=qnote.
За добавление doku.php?id= в запрос как раз и отвечает этот модуль
Подключение модуля
Для подключение модуля, в /etc/httpd/conf/httpd.conf добавляем строчку (она по дефолту уже должна быть) и перезапускаем apache.
LoadModule rewrite_module modules/mod_rewrite.so
Синтаксис Rewrite
Модуль оперирует следующими директивами:
- RewriteEngine - включение модуля, значение у директивы должно быть on. Off используем когда надо в нижестоящем каталоге отключить модуль rewrite настройки которого наследуются от родительского каталога.
- RewriteBase - задаем точку от которой будет идти предобразование адреса.
По дефолту /, можно задать свою, например /cacti/, для somesite.ru/cacti/somestring под преобразование попадет somestring. - RewriteCond - условие, при удовлетворении которого будет выполняться следующее за ним правило.
Например можно поставить условие, что запросы, пришедшие с определнных ip адресов, будут редиректиться на определенную страницу сайта.
Реальный пример - в ГО есть сервер мониторинга на котором для каждого ДО подготовлен свой комплексный экран с метриками офиса. Связкой директив RewriteCond+RewriteRule задаем, что администраторы из ДО (смотрим их ip адреса) могут ходить только на свой комплексный экран, если пробуют указать другой адрес, то делается редирект на “домашнюю” страницу комплексного экрана. - RewriteRule - тут, с использованием регулярных выражений, пишем правило.
RewriteRule {REGEXP_ДЛЯ_СРАВНЕНИЯ} {ВЫРАЖЕНИЕ_ПО_КОТОРОМУ_ИДЕТ_ЗАМЕНА} [ДОПОЛНИТЕЛЬНЫЕ,ОПЦИИ] - RewriteLog - включаем логирование, указываем файл куда писать лог.
- RewriteLogLevel - указываем
- RewriteLock -
- RewriteMap -
Дополнительные опции RewriteRule:
- NC - не учитывать регистр.
- L - прервать дальнейшую проверку при совпадении.
- OR - логическое “или”.
- QSA (query string append) - добавить в измененную строку переменные из запроса.
Шпаргалка - http://wiki.ua.sapo.pt/w/images/4/49/Mod_rewrite-cheat-sheet-v2.pdf, mod_rewrite-cheat-sheet-v2.pdf
Примеры
Правила для DokuWiki
Правила которые делают красивые ссылки для Dokuwiki.
RewriteEngine on RewriteRule ^_media/(.*) lib/exe/fetch.php?media=$1 [QSA,L] RewriteRule ^_detail/(.*) lib/exe/detail.php?media=$1 [QSA,L] RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L] RewriteRule ^$ doku.php [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) doku.php?id=$1 [QSA,L] RewriteRule ^index.php$ doku.php
Разбор примера:
- Запрос mykb.ru/_media/topic/grafana_works.png будет переделан в mykb.ru/lib/exe/fetch.php?media=topic/grafana_works.png, после срабатывания правила остановиться.
RewriteRule ^_media/(.*) lib/exe/fetch.php?media=$1 [QSA,L] RewriteRule ^_detail/(.*) lib/exe/detail.php?media=$1 [QSA,L] RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L]
- Если после mykb.ru пустота, то запрос запрос будет переделан в mykb.ru/doku.php, после срабатывания правила остановиться.
RewriteRule ^$ doku.php [L]
- Проверяем, что имя в запросе это не файл и не директория.
Если это так, то ко всему, что идет после mykb.ru добавляем doku.php?id= и отправляем серверу.
Фактически (.*) передаем в переменную $1.
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule doku.php?id doku.php?id=$1 [QSA,L]
- Переписываем mykb.ru/index.php в mykb.ru/doku.php.
RewriteRule ^index.php$ doku.php
Перманентный редирект
С сетей 10.40.1.0/24 и 10.40.30.0/24 надо дать досту к graphs.noc.company.name/nsk/*.
При попытке пойти по другим адресам сделать перманентный редирект на graphs.noc.company.name/nsk/index.html.
<VirtualHost *:443> ServerName graphs.noc.company.name ServerAdmin admin@company.name DocumentRoot /var/www/graphs/ ##### SSLEngine on SSLCertificateFile /etc/httpd/ssl/graphs.noc.company.name.crt SSLCertificateKeyFile /etc/httpd/ssl/graphs.noc.company.name.key ##### <Directory "/var/www/graphs"> RewriteEngine on RewriteCond %{REMOTE_ADDR} ^(10\.40\.(1|30)\.[0-9]{1,3})$ RewriteCond %{REQUEST_URI} !^nsk/(.*)$ [NC] RewriteRule ^(.*)$ https://graphs.noc.company.name/nsk/index.html [L,R=301] </Directory> #### ErrorLog logs/graphs_error.log CustomLog logs/graphs_access.log common </VirtualHost>
Логика:
- Запрос пришел с адреса из сетей 10.40.1.0/24 и 10.40.30.0/24
И - Запрос начинается не с nsk, без учета регистра.
Тогда - Делаем редирект на graphs.noc.company.name/nsk/index.html и останавливаем дальнейшую провекку.
Разбор примера:
- Смотрим с каких сетей пришел запрос.
Если адрес из сетей 10.40.1.0/24 и 10.40.30.0/24, то условие выполнилось, можно переходить к след. условию.
Третий октет может принимать значения 1 или 30, четверты октет можем принимать значения от 0 до 999.
RewriteCond %{REMOTE_ADDR} ^(10\.40\.(1|30)\.[0-9]{1,3})$
- Смотрим с чего начинается запрос, если не с nsk, то второе условие выполнилось и можно переходить к самому правилу.
RewriteCond %{REQUEST_URI} !^nsk/(.*)$ [NC]
- Все, что пришло в запросе переписываем на graphs.noc.company.name/nsk/index.html, шлем клиенту код редиректа и дальнейшую проверку останавливаем.
RewriteRule ^(.*)$ https://graphs.noc.company.name/nsk/index.html [L,R=301]
Директива AllowOverride
AllowOverride подключает файл .htaccess и позволяет опеределить конфигурацию каких директив можно перезаписать в файле .htaccess.
Ключи директивы AllowOverride:
- None - не смотрим в файл .htaccess, никакие директивы не переписываются.
- All - можно переписывать любые директивы.
- AuthConfig - переписываем директивы разрешения (AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, require, и т.д..)
- FileInfo - переписываем директивы, управляющие типами документа (AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority, и т.д..).
- Indexes - переписываем дерективы индексации каталога(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, и т.д..).
- Limit - переписываем директивы управления доступом (allow, deny и order).
- Options - переписываем директивы, управляющие специфическими особенностями каталога (Options и XBitHack).
Подключаем .htaccess который лежит в /var/www/someserver/ и разрешаем переписать все директивы.
<VirtualHost *:443> ServerName someserver.ru ServerAdmin admin@someserver.ru DocumentRoot /var/www/someserver/ ##### SSLEngine on SSLCertificateKeyFile /etc/letsencrypt/live/someserver/privkey.pem SSLCertificateFile /etc/letsencrypt/live/someserver/cert.pem SSLCertificateChainFile /etc/letsencrypt/live/someserver/chain.pem #### <Directory "/var/www/someserver"> AllowOverride All </Directory> #### ErrorLog logs/someserver_error.log CustomLog logs/someserver_access.log common </VirtualHost>
Директива Indexes
Директива позволяет просматривать содержимое каталога в отсутствии индексного файла (index.html, index.php и пр.).
Как правило эту директиру отключают по соображением безопасности и при попытке просмотреть содержимое каналога сервер выдаст 403 ошибку:
error] [client 10.20.30.40] Directory index forbidden by Options directive: /var/www/noc/prj/
В /var/www/noc/prj/ лежат файлы которым надо предоставить доступ (см. ниже), в этом случае разрешаем индексирование и конфиг будет выглядеть след. образом:
<Directory "/var/www/noc/prj"> Options Indexes Order deny,allow Deny from all Allow from 10.20.30.40 10.20.31.40 </Directory>
Директива Order
Директива позволяет ограничить доступ к каталогу или файлу по ip адресу и может быть прописана в файле .htaccess или в настройках сайта.
Директирва имет два режима работы:
- Order deny,allow - запрещаем доступ со всех ip и разрешаем с определенных.
- Order allow,deny - разрешаем доступ со всех ip и запрещаем с определенных.
Пример, разрешаем доступ к каталогу с двух ip адресов:
<Directory "/var/www/noc/prj"> Order deny,allow Deny from all Allow from 10.20.30.40 10.20.31.40 </Directory>