注意
有人建议这是如何使用.htaccess服务预压缩的gzip / brotli文件的重复问题。那个问题仅寻求提供预先压缩的文件。这个问题是不同的,请参见下文。
我的目标
当预先压缩的brotli文件存在时,我希望能够提供服务。如果不存在预先压缩的brotli文件,则降级为实时gzip压缩。
当前代码
我正在处理一个已经启用实时gzip的站点,其 .htaccess
文件如下:
<ifmodule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml...
</ifmodule>
修改后的代码
我设置了一个构建脚本,使用brotli压缩许多静态资源。为了提供这些资源,我用以下代码替换了上面的mod_deflate
块:
<IfModule mod_headers.c>
# Serve brotli compressed CSS and JS files if they exist
# and the client accepts brotli.
RewriteCond "%{HTTP:Accept-encoding}" "br"
RewriteCond "%{REQUEST_FILENAME}\.br" "-s"
RewriteRule "^(.*)\.(js|css)" "$1\.$2\.br" [QSA]
# Serve correct content types, and prevent double compression.
RewriteRule "\.css\.br$" "-" [T=text/css,E=no-brotli:1]
RewriteRule "\.js\.br$" "-" [T=text/javascript,E=no-brotli:1]
<FilesMatch "(\.js\.br|\.css\.br)$">
# Serve correct encoding type.
Header append Content-Encoding br
# Force proxies to cache brotli &
# non-brotli css/js files separately.
Header append Vary Accept-Encoding
</FilesMatch>
</IfModule>
问题
如果符合预期,它可以提供Brotli编码文件。 然而,我现在面临的问题是,因为在构建时剩余的资源没有进行Brotli编码,所以它们现在被无压缩地提供。
我一直无法弄清楚如何提供具有gzip备用的brotli而不需要我针对gzip输出进行预压缩。
感谢您的任何帮助!