Назад | Перейти на главную страницу

Конфигурация Apache - правило перезаписи для всех виртуальных хостов

У меня следующая конфигурация с двумя виртуальными хостами на моем Apache: www.domain.com и res.domain.com. Первый открыт, второй - только для зарегистрированных пользователей.

<VirtualHost *:80>
   ServerName www.domain.com
   DocumentRoot /website/www
   <Directory "/website/www">
      Options FollowSymLinks
      AllowOverride All
      RewriteEngine On  
      RewriteCond %{REQUEST_URI} !api/dispatch\.php$
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^api/.*$ api/dispatch.php [L,QSA]
   </Directory>
</VirtualHost>

<VirtualHost *:80>
   ServerName res.domain.com
   DocumentRoot /website/res
   <Directory "/website/res">
      Options FollowSymLinks
      AllowOverride All
      AuthType        Basic
      AuthUserFile    /website/res/users.sec
      <Limit GET POST>
         Require         valid-user
      </Limit>
   </Directory>
</VirtualHost>

Я хотел бы обслужить все звонки http://res.domain.com/api/* точно так же, как если бы они были http://www.domain.com/api/*. Нет аутентификации и такое же поведение ...

Важный: Я не хочу, чтобы мои пользователи видели перенаправление ...

Мне нужна помощь, потому что я много чего пробовал, но безуспешно.

ИЗМЕНИТЬ 1 Идея заключается в том, чтобы часть веб-сайта (в данном случае api) была доступна (= без аутентификации) со всех виртуальных хостов без репликации кода.

Папки:

   /website
     /www
       /img
       /api
       /css
       /...
     /res
       /...

Я попытался объединить Alias, RewriteRule и Directory ... например:

<VirtualHost *:80>
   ServerName www.domain.com
   DocumentRoot /website/www
   <Directory "/website/www">
      Options FollowSymLinks
      AllowOverride All
      RewriteEngine On  
      RewriteCond %{REQUEST_URI} !api/dispatch\.php$
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^api/.*$ api/dispatch.php [L,QSA]
   </Directory>
</VirtualHost>

<VirtualHost *:80>
   ServerName res.domain.com
   DocumentRoot /website/res
   Alias /api /website/www/api
   <Directory "/website/www/api">
      Options FollowSymLinks
      AllowOverride All
      Satisfy Any
      Allow from all

      RewriteEngine On  
      RewriteCond %{REQUEST_URI} !dispatch\.php$
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^.*$ dispatch.php [L,QSA]
   </Directory>
   <Directory "/website/res">
      Options FollowSymLinks
      AllowOverride All
      AuthType        Basic
      AuthUserFile    /website/res/users.sec
      <Limit GET POST>
         Require         valid-user
      </Limit>
   </Directory>
</VirtualHost>

В этом случае вызов http://res.domain.com/api/... все еще ограничен базовой аутентификацией.

Удовлетворять. Ваша конкретная потребность подробно описана в Требовать документы также.

   <Directory "/website/res/api">
      Satisfy Any
      Allow from all
   </Directory>

Затем вам нужно будет продублировать любое из правил перезаписи на vhost res.domain.com. Если вы хотите, чтобы тот же контент доставлялся из res.domain.com вам может понадобиться псевдоним в res.domain.com/api путь к твоему /website/www/api каталог.

Я понял!

RewriteBase скучал. Хотя это не обязательно при настройке первого домена, но во втором случае!

Мне также удается заставить его работать для любых виртуальных хостов, перемещающих конфигурацию каталога "api" на уровне сервера. Это дает:

# API Accessible from all domains
Alias /api /website/www/api
<Directory "/website/www/api">
   Options FollowSymLinks
   AllowOverride None
   Satisfy Any
   Allow from all

   RewriteEngine On
   RewriteBase /api/
   RewriteCond %{REQUEST_URI} !dispatch\.php$
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^.*$ dispatch.php [L,QSA]
</Directory>

# Virtual hosts
<VirtualHost *:80>
   ServerName www.domain.com
   DocumentRoot /website/www
   <Directory "/website/www">
      Options FollowSymLinks
      AllowOverride All
      Order allow,deny
      Allow from all 
   </Directory>
</VirtualHost>

<VirtualHost *:80>
   ServerName res.domain.com
   DocumentRoot /website/res
   <Directory "/website/res">
      Options FollowSymLinks
      AllowOverride All
      AuthType        Basic
      AuthUserFile    /website/res/users.sec
      <Limit GET POST>
         Require         valid-user
      </Limit>
   </Directory>
</VirtualHost>

Спасибо @mindthemonkey за триггер;)