User Tools

Site Tools


qnote:apache

Быстрые записки по Apache

Модуль 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

Разбор примера:

  1. Запрос 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]
  2. Если после mykb.ru пустота, то запрос запрос будет переделан в mykb.ru/doku.php, после срабатывания правила остановиться.
    RewriteRule ^$                        doku.php  [L]
  3. Проверяем, что имя в запросе это не файл и не директория.
    Если это так, то ко всему, что идет после mykb.ru добавляем doku.php?id= и отправляем серверу.
    Фактически (.*) передаем в переменную $1.
    RewriteCond %{REQUEST_FILENAME}       !-f
    RewriteCond %{REQUEST_FILENAME}       !-d
    RewriteRule doku.php?id                      doku.php?id=$1  [QSA,L]
  4. Переписываем 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>

Логика:

  1. Запрос пришел с адреса из сетей 10.40.1.0/24 и 10.40.30.0/24
    И
  2. Запрос начинается не с nsk, без учета регистра.
    Тогда
  3. Делаем редирект на graphs.noc.company.name/nsk/index.html и останавливаем дальнейшую провекку.

Разбор примера:

  1. Смотрим с каких сетей пришел запрос.
    Если адрес из сетей 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})$
  2. Смотрим с чего начинается запрос, если не с nsk, то второе условие выполнилось и можно переходить к самому правилу.
    RewriteCond %{REQUEST_URI} !^nsk/(.*)$ [NC]
  3. Все, что пришло в запросе переписываем на 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>

Полезные ссылки

qnote/apache.txt · Last modified: 2021/08/12 08:35 (external edit)

Page Tools