当.htaccess位于子目录中时,mod_rewrite会有帮助

时间:2014-09-07 14:11:44

标签: regex apache .htaccess mod-rewrite

我有一个简单的重写规则,用于检查请求文件的* .gz版本是否存在,如果存在,则将该文件返回给浏览器(它基于此技术提供压缩的CSS& JS: https://blog.jcoglan.com/2007/05/02/compress-javascript-and-css-without-touching-your-application-code/)。

假设我的CSS& JS驻留在我站点的/ cache子目录中,例如:

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

当以下指令放在 webroot 的.htaccess文件中时,一切都按预期工作:

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

但是,我更喜欢将这些规则放在位于该/ cache目录中的单独的.htaccess文件中。但按原样粘贴,规则不再有效。据我所知,最后一次RewriteCond失败了,例如检查所请求的文件名是否存在的条件。

我尝试添加RewriteBase /cache/,但这似乎无法奏效。我已经删除了我的webroot .htaccess,以防有另一个指令存在冲突。我也尝试将RewriteRule更改为:

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

虽然我认为最终可能是正确的,但它仍然无法正常工作 - 就像我说的那样,因为据我所知,RewriteCond失败了。

所以我很难过!有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

以下规则应该来自/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]