web-dev-qa-db-ja.com

ApacheにCSSおよびJSファイルの手動で事前圧縮されたgzファイルを使用するように強制する方法は?

簡単な質問があります。ウェブディレクトリ/cssがあり、中にはファイルstyle.cssがあります。このファイルを手動でgzip圧縮し、style.css.gzとして保存しました。各リクエストでCSSファイルが圧縮されないようにCPUサイクルを節約したいのですが。 .gzファイルを何度も圧縮する代わりに、この.cssファイルを検索して提供するようにApacheを設定するにはどうすればよいですか?

注:Apacheに.gzファイル自体を作成させたくありません。私のシナリオでは、.css.gzファイルを手動で作成する必要があります-特定のリクエストでPHPを使用します。

30
Frodik

一部のRewriteRuleはこれを非常にうまく処理する必要があります。

Drupal構成ファイルで私が見つけた:

# AddEncoding allows you to have certain browsers uncompress information on the fly.
AddEncoding gzip .gz

#Serve gzip compressed CSS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.css $1\.css\.gz [QSA]

# Serve gzip compressed JS files if they exist and the client accepts gzip.
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 \.css\.gz$ - [T=text/css,E=no-gzip:1]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]

これは仕事をします。どちらかを<Directory foo/>セクションまたは.htaccessファイル。Apache設定にアクセスできない場合、またはWebサーバーの速度を低下させる場合。

50
regilero

Regileroの回答を続けて、サーバーが対応するContent-Encodingヘッダーで確実に応答するように、さらに数行追加する必要があります。

#Serve gzip compressed CSS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.css $1\.css\.gz [QSA]

# Serve gzip compressed JS files if they exist and the client accepts gzip.
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 \.css\.gz$ - [T=text/css,E=no-gzip:1,E=is_gzip:1]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1,E=is_gzip:1]
Header set Content-Encoding "gzip" env=is_gzip
9
tsilvestre

mod_rewriteを使用して コンテンツネゴシエーション を実装するのではなく、 q-valuesstatus 406[〜#〜] tcn [〜#〜] など)mod_negotiationこの質問 で説明されているように。そこから 私の答え をコピーしています:

Options +MultiViews
RemoveType .gz
AddEncoding gzip .gz
<FilesMatch ".+\.tar\.gz$">
    RemoveEncoding .gz
    # Note:  Can use application/x-gzip for backwards-compatibility
    AddType application/gzip .gz
</FilesMatch>

これには、.gz.css.gzだけでなく、すべての.js.gzファイルで機能するという追加のボーナスがあり、追加のエンコーディング用に簡単に拡張できます。

存在しないファイルへのリクエストのみがネゴシエートされるため、これには1つの大きな欠点がありますファイル名前付きfoo.jsは、/foo.js/fooではなく)を要求して、圧縮されていないバージョンを返します。これは、 FrançoisMarierの非圧縮ファイルの名前を二重拡張子に変更するソリューション を使用して回避できるため、foo.jsfoo.js.jsとしてデプロイされます。この制限がデプロイメントプロセスにとってそれほど痛くない場合は、mod_negotiationの使用を検討する価値があります。

7
Kevinoid

これはあなたが尋ねたものではないことに気づきましたが、とにかくそれを捨てます。単にmod_cachemod_gzip?適切な設定を行うと、Apacheはファイルをgzipして、圧縮されたキャッシュファイルをクライアントとダウンストリームプロキシに渡します。これは、時間と労力の点で提案したものよりもはるかに効率的であり、帯域幅と計算負荷の点でも同等に効率的です。

PHPが最初にファイルを圧縮したことは問題ではありません。適切な設定でmod_gzipがそれを検出するためです。主なポイントは、圧縮ファイルをキャッシュでき、Apacheがそれらを再圧縮しないことです。

6
SpliFF

このブログ投稿 探していたステップバイステップではないですか?

このgzipされたバージョンのファイルが存在することを確認し(4行目)、存在する場合は、要求されたファイル名に.gzを追加します

1
Bathz