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

时间:2016-06-17 16:48:24

标签: apache .htaccess mod-rewrite gzip content-type

我有一个静态网页,希望通过提供所有可用文件的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 (.+) $1.gz [L]
</IfModule>

重写效果很好,但不幸的是,服务器还会更改 application / x-gzip 响应的 Content-Type ,这会使浏览器下载文件而不是渲染它。有没有办法阻止apache服务器更改内容类型并呈现页面而不是下载gz?

1 个答案:

答案 0 :(得分:0)

这要求您具有以下格式的文件的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))$ $1.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>