2014-09-07 6 views
2

J'ai une règle de réécriture simple qui vérifie si une version * .gz du fichier demandeur existe, et si c'est le cas, renvoie ce fichier au navigateur (il est basé sur cette technique pour servir le CSS & JS: https://blog.jcoglan.com/2007/05/02/compress-javascript-and-css-without-touching-your-application-code/).aide mod_rewrite lorsque .htaccess est situé dans le sous-répertoire

On suppose que mes CSS & JS résident dans un/cache sous-répertoire de mon site, par exemple:

http://domain.com/cache/app.css 
http://domain.com/cache/app.css.gz 
http://domain.com/cache/app.js 
http://domain.com/cache/app.js.gz 

Lorsque les directives suivantes sont placées dans le fichier .htaccess à Webroot, tout fonctionne comme prévu:

AddEncoding gzip .gz 
RewriteCond %{HTTP:Accept-encoding} gzip 
RewriteCond %{HTTP_USER_AGENT} !Safari 
RewriteCond %{REQUEST_FILENAME}.gz -f 
RewriteRule ^(.*)$ $1.gz [QSA,L] 

Cependant, je préfère placer ces règles dans un fichier .htaccess distinct qui se trouve dans ce répertoire/cache. Mais collé tel quel, les règles ne fonctionnent plus. D'après ce que je peux dire, la dernière RewriteCond échoue, par ex. la condition qui vérifie si le nom de fichier demandé existe.

J'ai essayé d'ajouter RewriteBase /cache/ mais cela ne semblait pas fonctionner. J'ai supprimé mon site Web .htaccess au cas où il y aurait une autre directive qui était en conflit. J'ai aussi essayé de changer le RewriteRule:

RewriteRule ^(.*)$ /cache/$1.gz [QSA,L] 

Et alors que je pense que cela pourrait être correct à la fin, il ne fonctionne toujours pas - comme je l'ai dit parce que de ce que je peux dire que c'est le RewriteCond qui est échouer.

Donc je suis perplexe! De l'aide?

+0

Avez-vous vérifié les logs Apache? Quels fichiers essaye-t-il réellement de servir? –

Répondre

1

règle devrait fonctionner à partir /cache/.htaccess:

AddEncoding gzip .gz 
RewriteEngine On 

# Determine the RewriteBase automatically/dynamically 
RewriteCond $0#%{REQUEST_URI} ^([^#]*)#(.*)\1$ 
RewriteRule ^.*$ - [E=BASE:%2] 

RewriteCond %{HTTP:Accept-encoding} gzip 
RewriteCond %{HTTP_USER_AGENT} !Safari 
RewriteCond %{DOCUMENT_ROOT}%{ENV:BASE}/$1\.gz -f [NC] 
RewriteRule ^(.+?)/?$ $1.gz [L] 
+0

D'où vient le '$ 1' dans'% {DOCUMENT_ROOT}/cache/$ 1 \ .gz'? – hjpotter92

+0

'$ 1' vient de' RewriteRule' car 'mod_rewrite' traite d'abord' RewriteRule'. – anubhava

+1

Merci beaucoup, cela fait l'affaire! Cependant, il ne semble pas que RewriteBase soit nécessaire - et en effet lorsque je supprime cette directive, tout fonctionne toujours. Et pourriez-vous expliquer la dernière RewriteRule, en particulier le /? dans la première partie du match? –