Como servir conteúdo diferente usando o apache e (talvez) mod_rewrite

1

Existem alguns arquivos (com nomes exclusivos) em uma estrutura de diretórios como esta:

/var/www/domain1/unique_filename1
/var/www/domain2/unique_filename2
/var/www/domain3/unique_filename3

No momento, todos os diretórios do domínio são acessíveis como subdiretórios de um domínio mestre e os clientes podem acessar os arquivos usando os seguintes URIs:

www.my-master-domain.com/domain1/unique_filename1
www.my-master-domain.com/domain2/unique_filename2
www.my-master-domain.com/domain3/unique_filename3

Eu gostaria de modificar a configuração do Apache 2.4 para que eu possa acessar arquivos sem mencionar os domínios secundários em meus URLs, por exemplo:

www.my-master-domain.com/unique_filename1
www.my-master-domain.com/unique_filename2
www.my-master-domain.com/unique_filename3

E é claro que não é desejável fazer nenhum redirecionamento em navegadores de clientes (e evento Se eu quisesse, não seria possível neste caso especial), eu preciso apenas fazer o servidor diretamente dos arquivos via o segundo conjunto de URLs mencionados. / p>

Alguma idéia?

    
por Ehsan Khodarahmi 06.12.2017 / 20:29

1 resposta

1

Você pode criar um RewriteMap que mapeie nomes de arquivos "exclusivos" para o domínio em que está armazenado. Você pode então usar uma diretiva RewriteRule para procurar o domínio a partir do nome de arquivo "exclusivo" solicitado e reescrever internamente o pedido.

Por exemplo, na configuração do seu servidor, defina o RewriteMap :

RewriteMap fn2domain "txt:/var/www/filename-to-domain-map.txt"

Em seguida, em /var/www/filename-to-domain-map.txt você incluiria todos os mapeamentos de nome de arquivo:

# Filename to Domain map
unique_filename1 domain1
unique_filename2 domain2
unique_filename3 domain3

Agora você pode usar mod_rewrite para fazer referência a este mapa para reescrever internamente uma solicitação de /unique_filename2 a /domain2/unique_filename2 (por exemplo).

RewriteEngine On
RewriteRule ^/([^/]+)$ /${fn2domain:$1}/$1 [L]

Isso pressupõe que "unique_filename" é exatamente isso; apenas um nome de arquivo. Nenhum caminho de URL adicional.

Você poderia tornar a pesquisa mais eficiente usando um arquivo de hash dbm: DBM (ou fastdbd: SQL Query?) em vez de um arquivo de texto simples, se você tiver muitos "nomes de arquivos".

Referência:
link

Como alternativa, você pode executar verificações de sistema de arquivos para a existência de "unique_filename" em cada subdiretório domain . O primeiro jogo vence. Isso pode ser OK se você tiver apenas 2 ou 3 subdiretórios de domínio, mas se tiver muitos, isso pode se tornar um problema de desempenho, pois as verificações do sistema de arquivos são relativamente caras. Por exemplo, novamente usando mod_rewrite:

RewriteEngine On

# Is it in domain1? Then rewrite to domain1 subdirectory
RewriteRule %{DOCUMENT_ROOT}/domain1/$1 -f
RewriteRule ^/([^/]+)$ /domain1/$1 [L]

# Is it in domain2? Then rewrite to domain2 subdirectory
RewriteRule %{DOCUMENT_ROOT}/domain2/$1 -f
RewriteRule ^/([^/]+)$ /domain2/$1 [L]

# Is it in domain3? Then rewrite to domain3 subdirectory
RewriteRule %{DOCUMENT_ROOT}/domain3/$1 -f
RewriteRule ^/([^/]+)$ /domain3/$1 [L]

# Repeat for each domain...
    
por 07.12.2017 / 02:13