У меня следующая конфигурация с двумя виртуальными хостами на моем 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 за триггер;)