我有一个简单的重写规则,用于检查请求文件的* .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失败了。
所以我很难过!有什么帮助吗?
答案 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]