如何配置mod_rewrite来提供缩小文件(如果有)?

时间:2008-10-28 12:38:51

标签: apache mod-rewrite minify

问题在于:我们有很多Javascripts和很多CSS文件,我们宁愿将其缩小。缩小很简单:设置YUI Compressor,运行Ant任务,然后吐出缩小的文件,我们将其保存在原件旁边。

因此,我们最终在DocumentRoot中的某个位置结束了以下目录结构:

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

现在我们需要的是Apache提供 min 子目录中的文件,并回退到服务未压缩文件,如果它们的缩小版本不可用。最后一个问题是我无法解决的问题。

例如:假设我们有 example.com/js/foo.js 的请求 - 在这种情况下,Apache应该发送 /js/min/foo-min.js的内容即可。没有缩小的 quux.js ,因此对 /js/quux.js 的请求会返回 /js/quux.js 本身,而不是404。最后,如果没有 /js/fred.js ,它应该以404结尾。

实际上,我正在设置构建脚本,以至于未在生产服务器上部署未分解的文件,但此配置在集成服务器和开发机器上仍然有用。

3 个答案:

答案 0 :(得分:5)

这是最终有效的配置:

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

css 目录相同。

答案 1 :(得分:3)

您可以使用RewriteCond检测缩小文件的存在:

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

答案 2 :(得分:0)

是否可以更改构建脚本?如果是这样,您可以将它们配置为缩小文件并为它们提供相同的文件名,但只有在提供了适当的标志时,例如ant productionDeploy代替ant integrationDeploy。这样,缩小过程对构建脚本以外的所有内容都是完全透明的。