【问题标题】:Apache - serving pre-compressed gzip file doesn't workApache - 提供预压缩的 gzip 文件不起作用
【发布时间】:2017-09-13 18:42:18
【问题描述】:

我在使用 Apache (2.4) 的重写规则来提供压缩文件时遇到问题。

我的 javascript 捆绑过程会为它创建的每个 .js 生成 .gz 文件。我已经在 apache a2enmod rewrite 上激活了重写模块,并像这样设置 .htacess 文件:

AddEncoding gzip .gz
RewriteEngine on

RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule "^(.*)\.js" "$1\.js\.gz" [QSA]

# Serve correct content types, and prevent mod_deflate double gzip.
RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1]

<FilesMatch ".+\.(js\.gz)$">
  Header append Content-Encoding gzip
  Header append worked yes   
</FilesMatch>

我遇到的问题是:

  1. 第一个条件RewriteCond %{HTTP:Accept-encoding} gzip 永远不会计算为真。在 Chrome 开发人员工具上,客户端发送此标头 Accept-Encoding:gzip, deflate, br(我尝试将 gzip、deflate、br 添加到条件中,但它不起作用);
  2. 即使我消除了上述条件,我也无法在 Chrome 开发工具中看到标题 Content-Encoding
  3. 我在响应标头中看不到Content-length。但它会回复 Transfer-Encoding:chunked,我觉得这很奇怪;

这些是在我的 apache 上启用的模块(我认为它们在我的 ubuntu dist 中默认启用,因为我没有激活其中任何一个)

access_compat.load  authz_user.load  filter.load       rewrite.load
alias.conf          autoindex.conf   headers.load      setenvif.conf
alias.load          autoindex.load   mime.conf         setenvif.load
auth_basic.load     deflate.conf     mime.load         status.conf
authn_core.load     deflate.load     mpm_event.conf    status.load
authn_file.load     dir.conf         mpm_event.load
authz_core.load     dir.load         negotiation.conf
authz_host.load     env.load         negotiation.load

【问题讨论】:

    标签: javascript apache .htaccess mod-rewrite


    【解决方案1】:

    您那里的代码看起来正确并且在我的计算机上似乎可以正常工作,这表明问题出在其他地方。我能想到的一些可能性:

    • 也许缓存服务器/反向代理搞砸了(这是我的第一个猜测,除非您在 localhost 上进行测试或自己设置所有内容,或者知道没有这样的服务器)
    • 或者也许 mod_deflate 无论如何都会干扰(我的计算机上似乎没有安装它,所以我无法测试它);如果您有权访问主服务器配置,可以尝试注释掉 LoadModule 行吗?
    • 如果任何子目录的.htaccess 文件也使用重写规则,则父目录中的重写规则将不会运行。 (如果这是问题所在,RewriteOptions Inherit 应该使用这些特定规则。但是,这并不能解释分块编码。)
    • 在浏览器中强制刷新或清除缓存?

    【讨论】:

    • 非常感谢。最后,我们发现我们正在运行 datapower(一个 IBM 代理),它正在剥离 Accept-encoding 标头。