4

Web サーバーのすべての静的ファイルをローカルで圧縮しておき、要求に応じて圧縮または非圧縮で提供したいと考えています。

How can I pre-compress files with mod_deflate in Apache 2.x?の回答 実際、MultiViews を有効にし、適切な AddEncoding を使用することで、Apache がfoo.tar.gzを要求したときに Web サーバーから圧縮ファイルを返してくれるので、適切なヘッダーfoo.tarが付属しています。Content-Encoding:

ただし、これは、クライアントがAccept-Encoding: gzipサーバーに送信するヘッダーに含まれている場合にのみ機能します。OTOH クライアントが gzip エンコーディングをサポートしていない場合、サーバーは「受け入れられる」ものがないことを通知しfoo.tarます。

を使用すれば、送信する前に Apache にその tarball を解凍させることができますAddOutputFilter INFLATE tar。しかし、それを行うと、サーバーは要求時にfoo.tar.gz(または gzip エンコーディングを受け入れるように指定したときに) コンテンツも解凍しますが、これは明らかに望ましくありません。

では、クライアントが gzip content-encoding をサポートしていない場合に Apache にファイルを解凍させ、それ以外の場合には圧縮前のファイルを提供させるにはどうすればよいでしょうか?

編集: @covener の提案に基づいて、次のことを試しました。

AddEncoding x-gzip .gz .tgz
RemoveType application/x-gzip .gz .tgz
AddType application/x-tar .tgz

<Location /packages>
  FilterDeclare smgunzip CONTENT_SET
  FilterProvider smgunzip INFLATE req=Accept-Encoding !$gzip
  FilterChain smgunzip
</Location>

[ ここでは Apache-2.2.22 を使用。] しかし、結果は実際には最初の 3 行だけよりも悪くなります: .tar.gz ファイルを要求すると、"Content-Encoding:" なしで返され、.tar ファイルを要求すると、 「Accept-Encoding:」ヘッダーに関係なく、「Content-Encoding:」がなくても、tar.gz のコンテンツ (つまり、まだ圧縮されている)。

4

2 に答える 2

6

(AddEncoding gzip または x-gzip gz があることを確認してください。そうしないと壊れます)

2.4:

<Directory /home/covener/SRC/2.4.x/built/htdocs>
  Options +MultiViews
  MultiviewsMatch Any
  FilterDeclare gzip CONTENT_SET
  FilterProvider gzip INFLATE "! req('Accept-Encoding') =~ /gzip/"
  FilterChain gzip
</Directory>

2.2:

<Directory /home/covener/SRC/2.2.x/built/htdocs>
  Options +MultiViews
  MultiviewsMatch Any
  FilterDeclare gzip CONTENT_SET
  FilterProvider gzip INFLATE req=Accept-Encoding !$gzip
  FilterChain gzip
</Directory>
于 2014-11-26T13:44:42.433 に答える
0

これを試して:

DirectoryIndex "index.html.gz" "index.html"

# Don't list the compressed files in directory indexes - you probably don't want to expose
# the .gz URLs to the outside. They're also misleading, since requesting them will give the
# original files rather than compressed ones.
IndexIgnore "*.html.gz" "*.css.gz"

RewriteEngine On

# Rewrite requests for .html/.css files to their .gz counterparts, if they exist.
RewriteCond "%{DOCUMENT_ROOT}%{REQUEST_FILENAME}.gz" -s
RewriteRule "^(.*)\.(html|css)$" "$1\.$2\.gz" [QSA]

# Serve compressed HTML/CSS with the correct Content-Type header.
RewriteRule "\.html\.gz$" "-" [T=text/html,E=no-gzip:1]
RewriteRule "\.css\.gz$"  "-" [T=text/css,E=no-gzip:1]

# Define a filter which decompresses the content using zcat.
# CAVEAT: This will fork a new process for every request made by a client that doesn't
# support gzip compression (most browsers do), so may not be suitable if you're running a
# very busy site.
ExtFilterDefine zcat cmd="/bin/zcat -"

<FilesMatch "\.(html|css)\.gz$">
  <If "%{HTTP:Accept-Encoding} =~ /gzip/">
    # Client supports gzip compression - pass it through.
    Header append Content-Encoding gzip
  </If>
  <Else>
    # Client doesn't support gzip compression - decompress it.
    SetOutputFilter zcat
  </Else>

  # Force proxies to cache gzipped & non-gzipped css/js files separately.
  Header append Vary Accept-Encoding
</FilesMatch>

Apache を使用して静的な gzip 圧縮コンテンツを提供する、Daniel Collins からの引用。

于 2021-02-18T12:59:56.993 に答える