如何即时更新 .htaccess 以有条件地 gzip
How can I update .htaccess to conditionally gzip on-the-fly
备注
有人建议这是 How to serve precompressed gzip/brotli files with .htaccess 的副本。该问题仅寻求提供预压缩文件。这个问题是不同的。请看下面。
我的目标
我想在存在预压缩的 brotli 文件时提供它们。如果不存在预压缩的 brotli 文件,则回退到即时 gzip 压缩。
当前代码
我正在一个网站上工作,该网站已经从其 .htaccess
文件中启用了即时 gzip,如下所示:
<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)" "\.\.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 输出预压缩的 gzip 回退来为 brotli 提供服务。
感谢任何帮助,谢谢!
您的问题是您已将动态 gzip 配置替换为静态配置。
您需要两个配置位,还需要更改您的 Brotli 代码以将环境设置为 no-gzip
,这样它就不会回退。以下应该有效;
<ifmodule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml...
</ifmodule>
<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)" "\.\.br" [QSA]
# Serve correct content types, and prevent double compression.
RewriteRule "\.css\.br$" "-" [T=text/css,E=no-gzip:1]
RewriteRule "\.js\.br$" "-" [T=text/javascript,E=no-gzip: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>
备注
有人建议这是 How to serve precompressed gzip/brotli files with .htaccess 的副本。该问题仅寻求提供预压缩文件。这个问题是不同的。请看下面。
我的目标
我想在存在预压缩的 brotli 文件时提供它们。如果不存在预压缩的 brotli 文件,则回退到即时 gzip 压缩。
当前代码
我正在一个网站上工作,该网站已经从其 .htaccess
文件中启用了即时 gzip,如下所示:
<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)" "\.\.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 输出预压缩的 gzip 回退来为 brotli 提供服务。
感谢任何帮助,谢谢!
您的问题是您已将动态 gzip 配置替换为静态配置。
您需要两个配置位,还需要更改您的 Brotli 代码以将环境设置为 no-gzip
,这样它就不会回退。以下应该有效;
<ifmodule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml...
</ifmodule>
<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)" "\.\.br" [QSA]
# Serve correct content types, and prevent double compression.
RewriteRule "\.css\.br$" "-" [T=text/css,E=no-gzip:1]
RewriteRule "\.js\.br$" "-" [T=text/javascript,E=no-gzip: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>