Configure o Apache + Passenger para servir arquivos estáticos a partir de um diretório diferente

1

Estou tentando configurar o Apache e o Passenger para servir um aplicativo Rails. No entanto, também preciso que ele forneça arquivos estáticos de um diretório diferente de / public e dê prioridade a esses arquivos estáticos sobre qualquer coisa no aplicativo Rails.

O aplicativo Rails está em /home/user/apps/testapp e os arquivos estáticos em /home/user/public_html . Por vários motivos, os arquivos estáticos não podem simplesmente ser movidos para a pasta pública Rails. Observe também que o link deve ser veiculado pelo arquivo index.html na pasta public_html.

Aqui está a configuração que estou usando:

<VirtualHost *:80>

  ServerName  domain.com

  DocumentRoot /home/user/apps/testapp/public

  RewriteEngine On

  RewriteCond /home/user/public_html/%{REQUEST_FILENAME} -f
  RewriteCond /home/user/public_html/%{REQUEST_FILENAME} -d
  RewriteRule ^/(.*)$ /home/user/public_html/$1 [L]
</VirtualHost>

Isso serve ao aplicativo Rails, mas oferece 404 para qualquer conteúdo estático de public_html. Eu também tentei uma configuração que usa DocumentRoot /home/user/public_html , mas isso não serve ao aplicativo Rails, presumivelmente porque o Passenger não sabe processar o pedido.

Curiosamente, se eu alterar as condições para! -f e! -d e a regra de reconfiguração para redirecionar para outro domínio, ele funcionará como esperado (por exemplo, http://domain.com/doesnt_exist é redirecionado para http://otherdomain.com/doesnt_exist )

Como posso configurar o Apache para servir arquivos estáticos como este, mas permitir que todos os outros pedidos continuem no Passenger?

    
por Rory Fitzpatrick 25.10.2009 / 19:35

1 resposta

1

O problema foi um erro de mod_rewrite do garoto de escola - para que o RewriteRule seja executado, as duas instruções RewriteCond acima precisam ser satisfeitas, o que obviamente nunca será. Isso foi minha culpa por copiar isso de um teste de condição negativa e não perceber que eles teriam que ser separados. Embora chato de precisar de duas instruções RewriteRule, isso funciona perfeitamente:

  RewriteCond /home/user/public_html%{REQUEST_URI} -f
  RewriteRule ^ /home/user/public_html%{REQUEST_URI} [L]
  RewriteCond /home/user/public_html%{REQUEST_URI} -d
  RewriteRule ^ /home/user/public_html%{REQUEST_URI} [L]
    
por 25.10.2009 / 19:49