2012-01-31 10 views
23

Basit bir sorum var. /css web dizinim var ve iç dosya style.css. Bu dosyayı el ile gzipledim ve style.css.gz olarak kaydettim. Her bir istekte sıkıştırılmış CSS dosyasına sahip olmamak için CPU döngülerini kaydetmek istiyorum. Bu .gz dosyasını aramak ve .css dosyasını tekrar tekrar sıkıştırmak yerine Apache'yi nasıl yapılandırabilirim?Apache, CSS ve JS dosyalarının önceden sıkıştırılmış gz dosyasını manuel olarak kullanmak için nasıl zorlanır?

Not: Apache'nin .gz dosyasının kendisini oluşturmasını istemiyorum. Benim senaryoda, özel isteklerde PHP kullanarak, .css.gz dosyasını elle oluşturmak zorundayım.

+0

PHP ile bir şeyler yapıyorum. CDN'mde, Apache, tüm js ve css dosya isteklerini, tarayıcı veya kabul edilen dosya tarafından kabul edilirse sıkıştırılmış dosyaya hizmet veren bir php betiğine yeniden yazar. İlk olarak her iki dosyanın (orijinal ve sıkıştırılmış) son değişiklik zamanını karşılaştırır ve gerektiğinde yalnızca sıkıştırılmış dosyayı oluşturur. PHP kullanıyorsanız ve ilgilenirseniz onu yapıştırabilirim. – Nabab

cevap

45

Bazı RewriteRule bunları iyi işlemelidir. Bir Drupal yapılandırma dosyasında

buldum:

# 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] 

Bu işi yapacak. Apache yapılandırmasına erişiminiz yoksa veya web sunucunuzu yavaşlatmak istiyorsanız, bunu <Directory foo/> bölümüne veya bir .htaccess dosyasına koyabilirsiniz.

+5

LOL - htaccess ve webserver yavaşlama hakkında iyi yorum ;-) – Frodik

+0

Çözümünüzü kurdum, ancak kaynakların (JS + CSS) teslim edilmesine yönelik bekleme süreleri hala yüksek 50 - 100 ms'dir, bu yüzden Apache'nin Bu kuralları veya bir şeyi kullanmamak yanlıştır, çünkü statik dosyaları sunarken Chrome'daki Dev araçlarında görülen bekleme süresi daha küçük olmalıdır, doğru mu? – Frodik

+0

talebi kontrol edin Kabul kodlama gerçekten gzip. Kabul-Kodlama'da birkaç değerin olabileceği gerçeği belki de onu kırıyor olabilir. Genellikle, Sunucunun arkasındaki Varnish ile birlikte kullanırım ve bu başlık, varyantların daha basit bir versiyonudur: https://www.varnish-cache.org/trac/wiki/FAQ/Compression#Ithoughtyousaidthis, karmaşıktır. Accept-Ending RewriteCond'la sahip olduğunuz ('RewriteCond% {HTTP: Accept-encoding} gzip, deflate' gibi), bu sorundan kaynaklanıyorsa, – regilero

1

this blog post tam olarak aradığınız adım adım değil midir? ,

Biz dosyasının bu gzip'lenmiş sürümü (dördüncü hat) var olduğunu kontrol edin ve eğer sana ne sordu bu olmadığını biliyoruz, biz istenen dosya

+0

Evet, çok umut verici görünüyor. Ama ben Safari hakkında biraz şaşırdım. Blog yayını 2007'den beri ve Safari'nin gziplenmiş içerikle düzgün çalışmamasıyla ilgili daha fazla ayrıntı yok. Safari ile ilgili daha fazla detay var mı ve esas olarak bugünün versiyonu iyi çalışıyor mu? – Frodik

+0

Safari'nin 2012'de doğru şekilde işlemediğine inanamıyorum. Ancak, bunu kontrol edeceğim :). Orada biraz bilgi var: http://webmasters.stackexchange.com/questions/22217/which-browsers-handle-content-encoding-gzip-and-which-of-them-has-any-special – Bathz

+0

Ve bu Bana göre kurallar ilk olarak söz edilen aynı regilero. – Bathz

6

için .gz ekleme ama yine de oraya atıyorum. mod_gzip ile mod_cache'u kullanmayı düşündünüz mü? Doğru yapılandırma ile apache dosyaları sizin için gzip, sonra sıkıştırılmış önbellek dosyalarını istemcilere ve alt proxy'lere aktarır. Bu, zaman ve çaba açısından sunduğunuzdan ve bant genişliği ve sayısal yük açısından eşit derecede verimli olmasından çok daha etkilidir.

PHP'nin dosyaları ilk önce sıkıştırması önemli değil çünkü mod_gzip'in doğru ayarları bunu algılayacaktır. Ana nokta sıkıştırılmış dosyaları önbelleğe alabilir ve Apache bunları yeniden sıkıştırmayacaktır.

7

regilero yanıta devam ayrıca ilgili İçerik-Encoding başlığıyla Sunucunun cevapları yapmak için bir kaç satır daha eklemek gerekir:

#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 
+0

Bu ek için teşekkürler, ilk önce regilero'nun çözümünü kullanmayı denedim, ancak dosyalar "Content-Encoding" başlığı olmadan döndü ve bu yüzden doğru çalışmadı. – Alex

+1

http://httpd.apache.org/docs/2.4/mod/mod_deflate.html#precompressed benzer bir şeyi açıklar. Ayrıca, "Üstbilgiye Vary Accept-Encoding" ifadesini de eklediler. – MvG

3

Aksine mod_rewrite kullanarak kendi başınıza content negotiation uygulayan (ve eksik daha, status 406, TCN, vb. gibi daha gelişmiş özelliklerde this question'da anlatıldığı gibi mod_negotiation kullanmak isteyebilirsiniz. oradan my answer kopyalama:

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> 

Bunların hepsi .gz dosyalar için çalışma yerine sadece .css.gz ve .js.gz ve kolayca ek kodlamalar için uzatılarak avantaj vardır.

O foo.js adlı bir dosya /foo.js (ancak /foo) için istekte sıkıştırılmamış sürümünü dönecekti only requests for files which do not exist are negotiated beri önemli bir dezavantajı var.Bu, sıkıştırılmamış dosyaların bir çift uzantılı olarak yeniden adlandırılmasıyla François Marier's solution kullanılarak önlenebilir, bu nedenle foo.js, foo.js.js olarak dağıtılır. Bu kısıtlama, dağıtım işleminiz için çok acı verici değilse, mod_negotiation kullanılması dikkate alınmaya değer olabilir.

+0

Apache, "RewriteCond" tarafından kullanılan üstbilgileri "Vary" olarak otomatik olarak ekler: "HTTP üstbilgisi bir durumda kullanılırsa bu başlık, yanıtın Vary başlığına eklenir". http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond (ayrıca bkz. "novary" flag) – mems

+0

İyi yakalamak @mems. Haklısınız, düzeltilmeye hazırım. "Vary" başlığının düzgün ayarlanmadığıyla ilgili yanlış bildirimi kaldırdım. – Kevinoid

+0

Bu benim için çalışan cevaptır. Teşekkürler! Harika çözüm! –

İlgili konular