2008-10-28 6 views
2

Voici le problème: nous avons beaucoup de Javascripts et beaucoup de fichiers CSS, que nous préférons servir au minimum. La minification est simple: configurez le YUI Compressor, exécutez une tâche Ant et crachez les fichiers miniaturisés que nous enregistrons à côté des originaux.Comment configurer mod_rewrite pour servir les fichiers minifiés, s'ils sont disponibles?

Donc nous nous retrouvons avec la structure de répertoire suivant quelque part dans notre DocumentRoot:

 
/
    /js 
     /min 
     foo-min.js 
     bar-min.js 
     foo.js 
     bar.js 
     quux.js 
    /css 
     ... 

Maintenant que nous avons besoin que les fichiers servent Apache de l'min sous-répertoire, et fallback au service de fichiers non compressés, si leurs versions minifiées ne sont pas disponibles. Le dernier numéro est celui que je ne peux pas résoudre.

Par exemple: supposons que nous avons une demande de example.com/js/foo.js - dans ce cas, Apache doit envoyer le contenu de /js/min/foo-min.js. Il n'y a pas minified quux.js, donc demande à /js/quux.js retours /js/quux.js lui-même, et non pas 404. Enfin, s'il n'y a pas /js/fred.js, En fait, je définis des scripts de construction de telle manière que les fichiers non -minifiés ne sont pas déployés sur le serveur de production, mais cette configuration peut être utile sur un serveur d'intégration et sur des machines de développement.

Répondre

5

Voici la configuration qui a finalement fonctionné:

/js/.htaccess:

RewriteEngine On 

RewriteBase /js 

RewriteCond %{REQUEST_URI} ^/js/((.+)\.js)$ 
RewriteCond %{DOCUMENT_ROOT}/js/min/%2-min.js -f 
RewriteRule ^(.+)$ min/%2-min.js [L] 

même pour css.

0

Est-il possible de modifier vos scripts de construction? Si tel est le cas, vous pouvez les configurer pour réduire les fichiers et leur attribuer le même nom de fichier, mais uniquement s'ils sont fournis avec le drapeau approprié, par ex. ant productionDeploy au lieu de ant integrationDeploy. De cette façon, le processus de minification est complètement transparent à tout sauf le script de construction.

+0

Oui, c'est possible, et j'implémente le script de cette façon. Mais avoir deux versions (original et minifié) pourrait être très utile pour tester la configuration d'intégration pour voir si les versions minifiées ne sont pas cassées de quelque façon que ce soit. –

3

Vous pouvez utiliser RewriteCond pour détecter la présence d'un fichier minified:

RewriteCond %{REQUESTURI} ^/js/(.*\.js) 
RewriteCond js/min/%1 -f 
RewriteRule %1 min/%1 [L] 
+0

RewriteCond ... -f ne fonctionne-t-il pas avec des noms de fichiers complets? Ça n'a jamais marché pour moi avec des noms de fichiers relatifs. –

+0

Modifiez ensuite cette ligne RewriteCond en "RewriteCond% {DOCUMENT_ROOT}/js/min /% 1 -f". –

Questions connexes