防止apache在重写时改变内容类型

Prevent apache from changing content type when rewriting

我有一个静态网页,想通过提供所有可用文件的 gzip 版本来提高加载性能。该页面在 apache 服务器 mod_gzip 上 运行,除了 .htaccess 文件外,我无法更改任何配置。 因此,我在构建过程中创建了 gzip 文件,并希望将传入的请求重写为 .gz 文件。

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    ReWriteCond %{HTTP:accept-encoding} gzip
    ReWriteCond %{REQUEST_FILENAME} !.+\.gz$
    RewriteCond %{REQUEST_FILENAME}.gz -f
    RewriteRule (.+) .gz [L]
</IfModule>

重写工作完美,但不幸的是,服务器也将响应的 Content-Type 更改为 application/x-gzip使浏览器下载文件而不渲染它。有没有办法阻止 apache 服务器更改内容类型并呈现页面而不是下载 gz?

这需要您拥有以下格式的 2 个版本的文件。例如:

index.html
index.html.gz

styles.css
styles.css.gz

scripts.js
scripts.js.gz

这个htaccess 将重写发送gz 版本到浏览器的请求,同时保持原始文件的类型。您必须强制选择要发送的文件类型。否则它将使用 application/x-gzip 并且浏览器将下载文件。

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/css application/json application/javascript application/vnd.ms-fontobject application/font-ttf application/font-woff application/font-otf image/svg+xml
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP:Accept-Encoding} gzip
    RewriteCond %{REQUEST_FILENAME}.gz -f
    RewriteRule (.*\.(html|css|js|eot|ttf|woff|otf|svg))$ .gz [L]
</IfModule>

AddEncoding x-gzip .gz

<FilesMatch .*\.html.gz>
    ForceType text/html
</FilesMatch>

<FilesMatch .*\.css.gz>
    ForceType text/css
</FilesMatch>

<FilesMatch .*\.js.gz>
    ForceType application/javascript
</FilesMatch>

<FilesMatch .*\.eot.gz>
    ForceType application/vnd.ms-fontobject
</FilesMatch>

<FilesMatch .*\.ttf.gz>
    ForceType application/font-ttf
</FilesMatch>

<FilesMatch .*\.woff.gz>
    ForceType application/font-woff
</FilesMatch>

<FilesMatch .*\.otf.gz>
    ForceType application/font-otf
</FilesMatch>

<FilesMatch .*\.svg.gz>
    ForceType image/svg+xml
</FilesMatch>