Configuração do Apache - regra de reescrita para todos os hosts virtuais

4

Eu tenho a seguinte configuração com 2 hosts virtuais no meu Apache: www.domain.com e res.domain.com . O primeiro é aberto e o segundo é limitado a usuários registrados.

<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>

Gostaria de atender a todas as ligações http://res.domain.com/api/ * exatamente como se fossem http://www.domain.com/api/ *. Sem autenticação e mesmo comportamento ...

Importante : não quero que meus usuários vejam um redirecionamento ...

Preciso de ajuda porque tentei muitas coisas, mas sem sucesso.

EDIT 1 A idéia aqui é ter uma parte do site ('api' neste caso) acessível livremente (= sem autenticação) de todos os hosts virtuais sem replicar o código.

Pastas:

   /local na rede Internet
     / www
       / img
       / api
       / css
       / ...
     / res
       / ...

Eu tentei combinar Alias, RewriteRule e Directory ... ex:

<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>

Nesse caso, a chamada para http://res.domain.com/api/ ... ainda é restrita com autenticação básica.

Soupper de Alban
fonte
Que "muitas coisas" você já tentou? Ela ajuda se você nos dizer ( editar seu post para incluir esta informação ), caso contrário, nós apenas estamos indo para dizer-lhe para voltar e tentar todos eles de novo ...
voretaq7
Suas regras de alias e reescrita funcionam como você espera em res.domain.com/api se você remover as restrições de acesso em / website / res?
19413 Matt
@mindthemonkey infelizmente não: quando eu remover a segurança recebo uma página não encontrada na res.domain.com/api / ...
Alban Soupper
Bem, isso pode ajudar a explicar por que a configuração de acesso não está funcionando tão bem. O que aparece no log de erros quando você faz essa solicitação? Mais alguma coisa aparece no log de erros durante a inicialização do apache? Se nada de útil, você pode aumentar o nível de log para depurar e tentar novamente.
19413 Matt

Respostas:

2

Satisfazer . Sua necessidade específica também está detalhada nos documentos Exigir .

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

Você precisará duplicar qualquer regra de reescrita no vhost res.domain.com. Se você deseja que o mesmo conteúdo seja entregue, res.domain.compode ser necessário alias o res.domain.com/apicaminho para seu /website/www/apidiretório.

Matt
fonte
A pasta / webiste / res / api não existe porque o objetivo é reutilizar a seção api em / website / www / api. veja minha atualização no post
Alban Soupper
1

Deixa comigo!

O RewriteBase estava ausente. Mesmo que não seja obrigatório na configuração do primeiro domínio, é no segundo caso!

Eu também consigo fazê-lo funcionar para qualquer host virtual que mova a configuração de diretório "api" no nível do servidor. Dá:

# 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>

Obrigado @mindthemonkey pelo gatilho;)

Soupper de Alban
fonte