1 votes

Configurer Apache + Passenger pour servir des fichiers statiques à partir d'un répertoire différent

J'essaie de configurer Apache et Passenger pour servir une application Rails. Cependant, j'ai également besoin qu'il serve des fichiers statiques à partir d'un répertoire autre que /public et qu'il donne la priorité à ces fichiers statiques sur tout ce qui se trouve dans l'application Rails.

L'application Rails se trouve dans /home/user/apps/testapp et les fichiers statiques dans /home/user/public_html . Pour diverses raisons, les fichiers statiques ne peuvent pas être simplement déplacés dans le dossier public de Rails. Notez également que la racine http://domain.com/ doit être servi par le fichier index.html du dossier public_html.

Voici la configuration que j'utilise :

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

Cela sert l'application Rails mais donne 404 pour tout contenu statique de public_html. J'ai également essayé une configuration qui utilise DocumentRoot /home/user/public_html mais cela ne sert pas du tout l'application Rails, probablement parce que Passenger ne sait pas comment traiter la requête.

Il est intéressant de noter que si je change les conditions en !-f et !-d et la règle de réécriture en redirecto vers un autre domaine, cela fonctionne comme prévu (par ex. http://domain.com/doesnt_exist est redirigé vers http://otherdomain.com/doesnt_exist )

Comment puis-je configurer Apache pour qu'il serve des fichiers statiques comme celui-ci, tout en permettant à toutes les autres requêtes de continuer à passer ?

1voto

David Z Points 9015

Le problème était une erreur de mod_rewrite - pour que la RewriteRule soit exécutée, les deux déclarations RewriteCond ci-dessus doivent être satisfaites, ce qui, bien sûr, n'est jamais le cas. C'est ma faute, car j'ai copié cela à partir d'un test de condition négative et je n'ai pas réalisé qu'il fallait les séparer. Bien qu'il soit ennuyeux d'avoir besoin de deux instructions RewriteRule, cela fonctionne parfaitement :

  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]

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X