Apache: Kirim file gzip yang sudah dikemas sebelumnya

8

Saya ingin Apache mengirim file statis gzip'ed melalui kabel, tetapi juga ingin Apache tidak selalu gzip berulang-ulang. Jadi saya pikir jika tidak mungkin untuk mengirimkan file .gz jika ada. Pengaturan ini:

Struktur file:

static/
|
|--- style.css
|
\--- style.css.gz

Dan berikut ini dalam .htaccess:

aturan mod_rewrite:

RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz [L]

Dan pengaturan ini:

AddEncoding x-gzip .gz

Sebenarnya, ini berfungsi sejauh file .gz dikirim bukan .css, jika permintaan masuk /static/style.css. Masalahnya hanya, bahwa file tersebut dikirim sebagai "application / x-gzip" dan bukan sebagai "text / css". Menggunakan flag T mod_rewrite tidak mengubah ini. Juga tidak secara eksplisit

AddType text/css .css

Adakah yang tahu, bagaimana saya bisa mencapai perilaku yang diinginkan? Atau apakah itu tidak perlu karena alasan tertentu saya tidak memperhitungkannya?

EDIT: Ada kesulitan tambahan: Mengirim file asli ke klien tanpa dukungan gzip. Adakah yang tahu bagaimana ini bisa bekerja?

Boldewyn
sumber
Saya kagum ini tidak begitu jelas, karena rasanya gila memiliki server web yang tidak melakukan ini. Saya pikir IIS memiliki sistem untuk menyimpan salinan file statis gzip pada akses pertama. mod_deflate tidak menyebutkan fitur seperti itu.
rjmunro
dokumen mod_deflate apache memiliki contohnya sendiri sekarang: httpd.apache.org/docs/2.4/mod/mod_deflate.html#precompressed
cweiske

Jawaban:

5

Solusi untuk mengirim versi yang benar ke browser yang tidak menerima gzip akan menjadi sesuatu di sepanjang baris:

RewriteCond %{HTTP:Accept-Encoding} !gzip
...your rules here...

Juga, ada cara lain untuk mengubah jenisnya, yaitu:

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

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

HTH.

Sam Halicke
sumber
Keren Terimakasih! Apakah ada dokumen untuk% {HTTP: ...} thingy? Saya tidak melihat penyebutan di bagian RewriteCond dari Apache 2.2. FilesMatch adalah ide lain yang saya miliki tetapi saya pikir itu lebih bertele-tele. Karena kedua aturan perlu menjalankan mesin regexp, seharusnya tidak ada perbedaan nyata.
Boldewyn
Oke, temukan dokumennya. httpd.apache.org/docs/2.2/mod/mod_rewrite.html Saya baru saja melewatkan bagian yang menarik.
Boldewyn
Ini bukan masalah besar, tetapi membaca konfigurasi itu, jika seseorang secara manual mengambil file .css.gz, mereka akan mendapatkan teks / css, ketika mereka harus mendapatkan jenis aplikasi / x-gzip.
rjmunro
Mengapa ! sebelum gzip pada baris Accept-Encoding? Tentunya itu kebalikan dari yang Anda butuhkan?
rjmunro
Aku berpikir sama, masuk akal untuk memiliki RewriteCondhanya cocok ketika klien tidak menerima encoding gzip.
David Z
3

Ah, sepertinya saya menemukan solusinya: Bendera T tidak berfungsi jika diatur pada aturan yang sama, tetapi itu pasti berhasil, jika Anda membelanjakannya dengan aturan sendiri:

RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz

RewriteRule \.css\.gz$ - [T=text/css]
RewriteRule \.js\.gz$ - [T=text/javascript]

Tetap saya ingin mendengar solusi dan pendapat orang lain.

Boldewyn
sumber