Alias dinâmico do Apache com base no subdomínio

5

Eu tenho a seguinte estrutura como parte de um aplicativo ZF1 -

C:/www/multisite
C:/www/multisite/application
C:/www/multisite/public
C:/www/multisite/client1/uploads
C:/www/multisite/client2/uploads

Atualmente tenho o seguinte vhost para cada subdomínio -

<VirtualHost *:80>
    DocumentRoot "C:/www/multisite/public"
    ServerName client1.multisite.dev
    Alias /uploads C:/www/multisite/client1/uploads
    FallbackResource /index.php
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "C:/www/multisite/public"
    ServerName client2.multisite.dev
    Alias /uploads C:/www/multisite/client2/uploads
    FallbackResource /index.php
</VirtualHost>

Gostaria de conseguir isso dinamicamente com base no subdomínio, mas não consigo descobrir como fazer isso.

{sub_domain}.multisite.dev

levaria a um alias de

Alias /uploads C:/www/multisite/{sub_domain}/uploads

Isso é possível?

    
por nnichols 24.11.2013 / 22:16

2 respostas

6

[EDITAR] Como testei a solução. Agora funciona como um sonho, conforme detalhado abaixo. Eu fiz um deslize bobo no meu regex que agora está corrigido.

A idéia é usar o RewriteCond para capturar o fqdn no pedido e dividi-lo. O regex captura a parte mais à esquerda do nome de domínio que é então backreferenced no RewriteRule usando% 1. Eu também escape do diretório 'public' da tradução, o que o torna acessível usando um caminho URI comum a todos os fqdn: s mapeados para o site (veja o resultado do teste para exemplo concreto).

  • Desativei o arquivo de hosts virtuais para o propósito desta experiência.
  • Meus pontos de DNS client1.multisite.dev e client2.multisite.dev no meu servidor de teste do Apache 2.2.
  • O snippet a seguir está no meu httpd.conf.

.

RewriteEngine On

RewriteMap lowercase int:tolower
RewriteCond %{REQUEST_URI}        !^/public/
RewriteCond ${lowercase:%{HTTP_HOST}}        ^([^.]+)\.multisite\.dev$
RewriteRule ^/(.*) /myApache/runtime/docs/www/multisite/%1/$1

Eu criei essa estrutura de diretórios.

/myApache/runtime/docs/www/multisite/client1/uploads
/myApache/runtime/docs/www/multisite/client2/uploads
/myApache/runtime/docs/www/multisite/public

Cada dir tem um arquivo separado chamado index.htm. O conteúdo index.htm revela o caminho do diretório onde ele é colocado.

Navegue até link OU link dá este resultado:

Hi!
Served from /myApache/runtime/docs/www/multisite/public/index.htm 
See you!

Navegar para link dá o seguinte resultado:

Hi!
Served from /myApache/runtime/docs/www/multisite/client1/uploads/index.htm 
See you!

Navegar para link dá esse resultado:

Hi!
Served from /myApache/runtime/docs/www/multisite/client2/uploads/index.htm 
See you!

Também testei casos de mistura ao inserir o URL no meu navegador da web. Tudo é traduzido para minúsculas.

Noto que você está executando o Apache no Windows, cujos sistemas de arquivos nativos não diferenciam maiúsculas de minúsculas. A normalização do caso não seria, portanto, um requisito, embora eu pessoalmente ache que o URL em letras minúsculas é mais esteticamente agradável de se olhar no meu navegador. Em sistemas de arquivos que fazem distinção entre maiúsculas e minúsculas seria um requisito, portanto, incluo-os para conclusão.

Por fim, observei também que executar o Apache em uma porta diferente de 80 (ou seja, ter que soletrar na URL) quebra a referência anterior de RewriteRule. Eu não busquei uma solução para isso, no entanto.

Espero que isso seja igual ou próximo o suficiente para o que você precisa.

    
por 10.12.2013 / 22:23
3

Experimente o mod_vhost_alias: link Exemplo:

<VirtualHost *:80>
    ServerName apps.mydomain.ltd
    ServerAlias *.apps.mydomain.ltd
    VirtualDocumentRoot /web/mydomain.ltd/apps/%1/public_html
    CustomLog /web/mydomain.ltd/access_apache.log vhost_log_format
    ErrorLog /web/mydomain.ltd/logs/error_apache.log
    ServerAdmin [email protected]    
    <Directory "/web/mydomain.ltd/apps">
        Options FollowSymLinks
        Order allow,deny
        Allow from all
        AllowOverride All
    </Directory>
</VirtualHost>
    
por 25.11.2013 / 11:56