imho.ws |
![]() |
![]() |
![]() |
# 1 |
Guest
Сообщения: n/a
|
виртуальные хосты и mod_rewrite
Я хочу настроить виртуальные хосты используя mod_rewite (подразумевается создание сервера с динамическими хостами), но проблема в том, что сервер упорно не хочет понимать пути. Сам сервак -apache 2.0.44 - стоит на машине с NT5.1+SP1.
Допустим есть запрос http://mail.home/ вот часть конфига сервера: Код:
RewriteEngine On RewriteLogLevel 12 RewriteLog /var/logs/apache/apache_rewrite-log RewriteMap lc int:tolower RewriteMap vhostsmap txt:/hosts/vhosts.map RewriteCond ${lc:%{HTTP_HOST}|NONE} ^(.+)$ RewriteCond %1 !^.*gcserver.home$ RewriteCond ${vhostsmap:%1} ^/(.*)$ [NC] RewriteRule ^/(.*)$ /hosts/%1/www/$1 путь /hosts/home/mail/www/ что вышел в конце, реально существует. Вот что нам выдал сервак в логе: Код:
init rewrite engine with requested uri / applying pattern '^/(.*)$' to uri '/' map lookup OK: map=lc key=mail.home -> val=mail.home RewriteCond: input='mail.home' pattern='^(.+)$' => matched RewriteCond: input='mail.home' pattern='!^.*gcserver.home$' => matched cache lookup FAILED, forcing new map lookup map lookup OK: map=vhostsmap key=mail.home[txt] -> val=/home/mail RewriteCond: input='/home/mail' pattern='^/(.*)$' => matched rewrite / -> /hosts/home/mail/www/ local path result: /hosts/home/mail/www/ |
![]() |
# 2 |
Guest
Сообщения: n/a
|
![]()
В общем, я разобрался с этой проблемой, хоть это и стоило огромных усилий и сотен перезапусков сервера
![]() А загвоздка была вот в чем: При получении результата (правило RewriteRule ^/(.*)$ /hosts/%1/www/$1), допустим есть путь /hosts/home/mail/www/ подставлялся путь DocumentRoot сервера, что приводило к такому результату: g:/usr/local/apache/htdocs//hosts/home/mail/www/, соответственно получалась лажа. Решилось все банально просто: путь DocumentRoot сервера был изменен с g:/usr/local/apache/htdocs/ на g:/. Конечно были еще некоторые подстройки (ниже). И добавлена pass through опция, что позволяла передавать путь для дальнейших подстановок/преобразований серверу. И не маловажным было добавление опции No Subrequests чтобы исключить повторных добавлений пути!! Вот пример конфига, что работает на данный момент: Это файл vhosts.conf что подключается дополнительно к апачевскому конфигу. Код:
#добавлены опции "по умолчанию", кстати без них тоже на работало #причем, опция Indexes не должна быть включена! Иначе вместо #получения index.php выводился листинг каталога. Options FollowSymLinks ExecCGI MultiViews Includes ################################ RewriteEngine On RewriteLogLevel 12 RewriteLog /var/logs/apache/apache_rewrite-log ################################ RewriteMap lc int:tolower RewriteMap vhostsmap txt:/hosts/vhosts.map #добавлена проверка на то, не является ли запрос на #урл сервера, и если "да", то подставляем специфический путь. RewriteCond %{HTTP_HOST} ^.*gcserver.home [NC] RewriteRule ^/(.*)$ /usr/local/apache/htdocs/$1 [PT,L,NS] RewriteCond ${lc:%{HTTP_HOST}|NONE} ^(.+)$ #RewriteCond %1 !^.*gcserver.home$ RewriteCond %1 ^([a-z0-9_-]+\.[a-z]+)[/]*$ [OR] RewriteCond %1 ^www\.([a-z0-9_-]+\.[a-z]+)[/]*$ RewriteCond ${vhostsmap:%1} ^/(.*)$ [NC] RewriteRule ^/(.*)$ /hosts/%1/www/$1 [PT,NS] ################################ <Directory "/hosts/*/*"> AllowOverride None Order Allow,Deny Deny from All Options FollowSymLinks </Directory> <Directory "/hosts/*/*/www"> AllowOverride None Order Allow,Deny Allow from All Options Indexes MultiViews IncludesNOEXEC FollowSymLinks </Directory> <Directory "/hosts/*/*/cgi"> AllowOverride None Order Allow,Deny Allow from All Options Includes +ExecCGI FollowSymLinks </Directory> ScriptAlias /cgi/ /cgi/ ScriptAlias /cgi-bin/ /cgi/ ################################ ![]() Остается решить как еще обойти ДНС, ведь при добавлении нового имени нужно перечитывать всю зону, после чего проходит минут 5-10 прежде, чем будет новый хост виден.... У меня стоит SimpleDNS v.3.20.02 |